【问题标题】:What are the names in other lisps for Clojure's assoc-in?Clojure 的 assoc-in 在其他 lisps 中的名称是什么?
【发布时间】:2021-05-09 00:25:38
【问题描述】:

上下文

我们的团队正在使用其他语言(IE javascript 和 ruby​​)中的一些功能性更强的模式,并且我们就标准化命名进行了一些有趣的对话。我的熟悉程度主要限于 Clojure 和 Ramda.js。

Clojure 和 Ramda 都有 assoc,Clojure 有 assoc-in,Ramda 版本是 assocPath。我猜 Ramda 在这里抄袭了 Clojure 的名字。

我注意到,common lisp 似乎甚至没有与assoc-in 相当的清晰可比性。见this conversation。

问题

还有哪些其他 lisp 或 lisp-likes 具有 assoc 和 assoc-in 可比较对象,它们叫什么?

奖励积分

是否有任何资源用于“罗塞塔石碑”函数名称的 inter-lisp 比较?一个可以轻松查看可比行为具有相似或不同名称的位置,或查看可比名称具有相似或不同行为的位置?

【问题讨论】:

  • 我认为问题的“罗塞塔石碑”部分是最有趣的部分,也是唯一可能获得“答案”的部分,而不是大量贡献一小块的 cmets谜题。
  • 我已经看到了“更新”。 Common Lisp 有 acons 但不用于递归键,你需要使用 FSet 库来获得等效的东西。
  • 不是你要的,但我至少看过一个 Clojurescript/Javascript 翻译表。

标签: clojure lisp


【解决方案1】:

你说得对,Common Lisp 没有assoc-in 或类似的东西。我想说,总的来说,它对标准库中的哈希表操作有相当基本的支持(我将其归因于在标准开发时缺乏对它们的实践经验)。但是,即使存在更多与哈希表相关的内容,我仍然怀疑会添加类似 assoc-in 的内容。这是因为,在 Lisp 中,处理赋值的首选方法是通过涉及宏 define-setf-expander 的 setf'able 位置机制。

例如,我正在维护的rutils 库提供了许多额外的与哈希表相关的运算符,以及类似 Clojure 的文字语法。然而,这就是我使用其原语处理assoc-in 案例的方式(包括? 运算符,它是generic-elt 的简写):

CL-USER> (ql:quickload :rutils)
CL-USER> (in-package :rtl-user)
RTL-USER> (named-readtables:in-readtable rutils-readtable)
RTL-USER> (toggle-print-hash-table)
RTL-USER> (let ((ht #{:a 1 :b 3}))
            (setf (? ht :c) #{:d 33})
            ht)
#{
  :A 1
  :B 3
  :C #{
       :D 33
      }
 } 

我会说这是一个品味问题,更喜欢哪种方法。对我来说,Lisp 有更多的优势:它更加统一和明确。

另一个优点是get-in 部分变得非常简单:

RTL-USER> (? * :c :d)
33

(在这里,我使用* 来引用之前REPL 计算的结果,恰好是我们在assoc-in 练习中创建的哈希表)。

附:至于罗塞塔石碑,这里有一些尝试:

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多