如何将此代码从通用lisp转换为clojure



在公共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在直译方面给出了一个很好的答案。

但它在Clojure中有点独特,不鼓励使用封装在副作用setter和getter函数后面的数据。Clojure倾向于强调纯函数,并通过托管引用显式控制状态(请参阅Rich Hickey关于数据结构和托管引用的精彩视频)

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

(def number (atom 0))
@number
=> 0
(swap! number + 5)
=> 5
@number
=> 5

除了更简洁、更惯用的Clojure之外,swap!还可以对原子的值执行任意函数,而不仅仅是获取和设置(参见上面+5的示例)

这里有一个可能的代码翻译-get number函数是可访问的。

(let [number (atom 0)]
  (defn get-number []
    @number)
  (defn set-number [arg]
    (reset! number arg)))
(get-number) => 0
(set-number 5)
(get-number) => 5

最新更新