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

如何将此代码从common lisp转换为clojure,clojure,common-lisp,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 [

在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,这样您就可以访问这两个函数?

这里有一个可能的代码翻译-可以访问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
就直译而言

但在Clojure中有点单薄,不鼓励使用封装在副作用setter和getter函数后面的数据。Clojure倾向于强调纯函数和通过托管引用对状态的显式控制(参见此)

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

(def number (atom 0))

@number
=> 0

(swap! number + 5)
=> 5

@number
=> 5

除了更简洁、更惯用的Clojure之外,您还获得了
swap
可以在atom的值上执行aribtrary函数,而不仅仅是获取和设置(参见上面带有+5的示例)

您可以在LET-in-Common Lisp中使用DEFUN,但我一般不推荐使用它。DEFUN不再是LET中的顶级表单,它在编译方面有一些小缺点。@RainerJoswig-谢谢,我不知道这一点。