如何在ClojureScript中创建函数局部可变变量?

时间:2016-04-25 17:16:17

标签: clojurescript

考虑以下假设的无意义ClojureScript函数:

(defn tmp [] 
  (def p 0)
  (set! p (inc p))
  (set! p (inc p))
  (set! p (inc p)))

在REPL中重复执行此功能导致

3
6
9
etc.

是否可以创建一个函数本地的可变变量,这样输出就可以了

3
3
3
etc. 

在重复执行(tmp)的情况下?

1 个答案:

答案 0 :(得分:5)

let允许您分配仅限于其范围的变量:

(defn tmp[]
  (let [p 0]
    ...))

现在,clojurescript使用了不可变数据。这意味着一切都基本上是一个常数,一旦你设置了p的值,就没有改变它。有两种方法可以解决这个问题:

使用更多本地变量

(defn tmp[]
  (let [a 0
        b (inc a)
        c (inc b)
        d (inc c)]
    ...))

使用atom

原子与clojurescript中的其他数据结构有些不同,并允许控制其状态。基本上,您可以将它们视为对您的价值的参考。

创建原子时,将初始值作为参数传递。您可以通过在变量前面添加@来访问原子值,这实际上是(deref my-var)的宏。

您可以使用swap!reset!函数更改原子的值。在cljs cheatsheet中了解有关它们的更多信息。

(defn tmp[]
  (let [p (atom 0)]
    (reset! p (inc @p))
    (reset! p (inc @p))
    (reset! p (inc @p))))

希望这有帮助。