2

在常见的 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,以便您可以访问这两个函数?

4

2 回答 2

6

user593508在直译方面给出了很好的答案。

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

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

(def number (atom 0))

@number
=> 0

(swap! number + 5)
=> 5

@number
=> 5

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

于 2012-07-22T05:09:20.820 回答
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
于 2012-07-22T03:14:46.240 回答