如何将此代码从常见的lisp转换为clojure

zel*_*lio 2 clojure common-lisp

在常见的lisp中,我可以defun在同一个闭包中放置多个并使它们具有所有设置功能.

(let ((number 0))
  (defun get-number () number)
  (defun set-number ( arg ) (setq number arg)))
Run Code Online (Sandbox Code Playgroud)

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

(let [ number 0 ]
  (defn get-number [] number)
  (defn set-number [ arg ] (def number arg)))
Run Code Online (Sandbox Code Playgroud)

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

mik*_*era 6

user593508在字面翻译方面给出了一个很好的答案.

但它在Clojure中有点不同寻常,因为不鼓励使用封装在有效的setter和getter函数背后的数据.Clojure倾向于强调纯函数,并通过托管引用显式控制状态(请参阅Rich Hickey关于数据结构和托管引用的优秀视频)

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

(def number (atom 0))

@number
=> 0

(swap! number + 5)
=> 5

@number
=> 5
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*isR 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
Run Code Online (Sandbox Code Playgroud)