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

nil*_*ock 4 clojurescript

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

(defn tmp [] 
  (def p 0)
  (set! p (inc p))
  (set! p (inc p))
  (set! p (inc p)))
Run Code Online (Sandbox Code Playgroud)

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

3
6
9
etc.
Run Code Online (Sandbox Code Playgroud)

是否有可能创建该函数本地的可变变量,以使输出本来可以

3
3
3
etc. 
Run Code Online (Sandbox Code Playgroud)

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

Kub*_*cki 5

let 让您分配限于其范围的变量:

(defn tmp[]
  (let [p 0]
    ...))
Run Code Online (Sandbox Code Playgroud)

现在,clojurescript利用了不可变的数据。这意味着所有内容基本上都是常数,并且一旦设置了值p,就无法对其进行更改。有两种方法可以解决此问题:

使用更多局部变量

(defn tmp[]
  (let [a 0
        b (inc a)
        c (inc b)
        d (inc c)]
    ...))
Run Code Online (Sandbox Code Playgroud)

使用 atom

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

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

您可以使用swap!reset!函数更改原子的值。在cljs速查表中找到有关它们的更多信息。

(defn tmp[]
  (let [p (atom 0)]
    (reset! p (inc @p))
    (reset! p (inc @p))
    (reset! p (inc @p))))
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。