clojure - 如何将此代码从 common lisp 翻译为 clojure

标签 clojure common-lisp

在 common lisp 中,我可以在同一个闭包中放置多个 defun 并让它们全部设置函数。

(let ((number 0))
  (defun get-number () number)
  (defun set-number ( arg ) (setq number arg)))

如果我在 clojure 中使用相同的语法,那么只有最后一个函数最终会被定义。

(let [ number 0 ]
  (defn get-number [] number)
  (defn set-number [ arg ] (def number arg)))

有没有办法将此代码转换为 clojure,以便您可以访问这两个函数?

最佳答案

user593508 gives a good answer从字面翻译来看。

但这在 Clojure 中有点不习惯,不鼓励使用封装在有副作用的 setter 和 getter 函数后面的数据。 Clojure 倾向于强调纯函数,以及通过托管引用对状态进行显式控制(请参阅此 excellent video by Rich Hickey on data structures and managed references )

另一种方法是直接使用原子来存储可变数字:

(def number (atom 0))

@number
=> 0

(swap! number + 5)
=> 5

@number
=> 5

除了更简洁和更惯用的 Clojure 之外,您还可以获得额外的优势,即 swap! 可以对原子的值执行任意函数,而不仅仅是获取和设置(请参阅上面带有 +5 的示例) )

关于clojure - 如何将此代码从 common lisp 翻译为 clojure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11597208/

相关文章:

lisp - lisp中的字符串加法赋值

lisp - 了解 Common Lisp aref 行为

clojure - 为什么 Clojure 无法推断出这个 def 类型?

clojure - 检查 Clojure 中是否为 nil

rest - 如何在 noir 中创建 REST API 来接收 ids 列表?

list - Common LISP 在列表上应用逻辑运算符

sorting - Common Lisp 中的 "sort"函数使用什么算法?

common-lisp - 如何获取 Quicklisp 提供的每个系统的所有依赖项列表?

clojure - 如何在 clojure 中编写 java varg 函数?

clojure - map 文字必须包含偶数个形式