我想知道如何编写Revenge of the Nerds文章中包含的累加器示例。 很容易理解它是如何工作的,但是我无法在Clojure中重新创建它 - 它不会累积但只返回i的总和和n的初始给定值。
关键是 incf (在Common Lisp版本中)或 + = (在JavaScript中)。
换句话说:如何改变引用函数的状态?我已经看到了一些关于变量变量的例子,但它们看起来不是precisely pretty吗?
答案 0 :(得分:22)
不要做它!在为时已晚之前保存自己!无缘无故地改变状态不是Clojure所鼓励的,所以当然它不像普通的lisp那样方便。
但严重的是,这是解释闭包的经典示例,虽然它不是Clojure中非常有用的一个,但很高兴知道翻译。你必须写一些类似的东西:
(defn foo [n]
(let [acc (atom n)]
(fn [i] (swap! acc + i))))