在常见的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,以便您可以访问这两个函数?
答案 0 :(得分:6)
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!
可以对原子的值执行aribtrary函数,而不仅仅是获取和设置(参见上面的+5示例)
答案 1 :(得分: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