在 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/