关于Vars Clojure的问题

Asd*_*ren 3 functional-programming clojure

我是Clojure的新手,我读到它是一种功能语言.它说Clojure没有变量,当我找到(def n 5)时,它和变量之间有什么区别?

我可以改变var的值,所以它真的与变量不同吗?我不明白其中的区别.

Gui*_*ler 5

假设variable你的意思是指一个可变的存储位置,我猜主要区别(取决于你比较的语言)是,如果你动态重新绑定varin Clojure是基于每个线程.

但是答案很长,var除非你真的需要引用可变存储位置,否则你通常不会在Clojure中使用.

Clojure使用而不是引用来支持不变性和编程.

您可以观看Rich Hickey关于价值观的讨论.

总结一下,当您在Clojure中编程时,您拥有的是,而不是对可能更改的位置的引用(甚至可能由另一个线程更改).

所以.

(let [a 1 
      _ (println a) => prints 1
      a 2 
      _ (println a) => prints 2
     ]) 
Run Code Online (Sandbox Code Playgroud)

即使你a在代码中得到"改变" 的错觉,你也不会改变"旧" a,只是你有一个新的价值.(如果有人看过第一个定义,它仍会看到值1).

实际上你可以看到作为组合函数的赋值序列调用a范围中被替换的位置,但根本不是相同的"变量".

 ((fn [a]
    (println a) => prints 1
    ((fn [a]
        (println a) => prints 2
      ) 2) 1)
Run Code Online (Sandbox Code Playgroud)

尽管如此,如果你需要有许多潜在的线程访问该存储一个可变的存储,Clojure的给你 vars,atoms,refs,等.