在Clojure中编写累加器函数

时间:2011-12-09 07:48:50

标签: clojure paul-graham

我想知道如何编写Revenge of the Nerds文章中包含的累加器示例。 很容易理解它是如何工作的,但是我无法在Clojure中重新创建它 - 它不会累积但只返回i的总和和n的初始给定值。

关键是 incf (在Common Lisp版本中)或 + = (在JavaScript中)。

换句话说:如何改变引用函数的状态?我已经看到了一些关于变量变量的例子,但它们看起来不是precisely pretty吗?

1 个答案:

答案 0 :(得分:22)

不要做它!在为时已晚之前保存自己!无缘无故地改变状态不是Clojure所鼓励的,所以当然它不像普通的lisp那样方便。

但严重的是,这是解释闭包的经典示例,虽然它不是Clojure中非常有用的一个,但很高兴知道翻译。你必须写一些类似的东西:

(defn foo [n]
  (let [acc (atom n)]
    (fn [i] (swap! acc + i))))