在Clojure中编写累加器函数

vem*_*emv 7 clojure paul-graham

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

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

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

ama*_*loy 22

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

但严重的是,这是解释闭包的经典示例,虽然它不是在Clojure中非常有用的,但是很高兴知道翻译.你必须写下这样的东西:

(defn foo [n]
  (let [acc (atom n)]
    (fn [i] (swap! acc + i))))
Run Code Online (Sandbox Code Playgroud)

  • `public class RebuttalDriver {public static void main(String [] args){System.out.println("Clojure实际上非常简洁."); } (18认同)