Clojure 变量与其他语言中的指针/引用

标签 clojure

我试图理解 Var 的 clojure 概念.

据我所知,它只是一个值的引用/指针。 Var 的“根值”可以被认为是 Var 在线程上指向的初始值。此外,我认为——在幕后——每个 Var 都有一个它指向的内存位置的地址(尽管像 Java、Javascript 这样的语言不允许您访问该特定位置,并且可能做一些事情无论如何,在幕后使该地址不稳定)。

问题:这是正确的思考方式吗?将 clojure Var 视为值的引用/指针在哪些方面是错误的?

给定类似的东西

(def v 7)

这样说“Var #'v 指向值 7”是否合适?

最佳答案

是的,这是一个很好的想法。我会稍微调整一下你的最终陈述: #'v 扩展为 (var v),说 var (var v) 没有意义,相反我会说 var v。另外我会说解引用到值7而不是指向。是的,它们的行为类似于指针,但它们有一个特殊的 deref (或 @)形式来取消引用它们(并且您不能进行指针算术)。

我认为采用术语 deref 对于理解 Clojure 的另一个方面很重要:当您使用任何符号时,比如说我们进行函数调用 (inc 1),那里其实是隐藏步骤! inc 是一个与 var inc 相关联的符号,(inc 并不是真正的函数!inc 只是derefs 到函数),然后自动评估变量 deref。当您编写 (var inc) 时,您实际上只是在防止 deref。这就是为什么当你改变或替换一个 var 时,比如说我们重新定义了 inc,新的代码就会被执行。

重点是,当考虑指针时,您可能会想将 inc 视为某些 var 指向的函数。这是不正确的。 inc 是与取消引用函数的 var 关联的符号。使用 var inc 时,为了方便起见,它会自动解析为函数。从这个意义上说,您可能会认为仅说 v derefs 为值 7 是准确的。 v 是一个 var,你实际上不需要指定它。 (显然,当您试图明确指出它是一个 var 时,这是有意义的,因此将其称为 var 也没有错)。

关于Clojure 变量与其他语言中的指针/引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35525869/

相关文章:

clojure - clojure中的惯用文件锁定?

clojure - 使用leiningen安装库而不创建项目

clojure - 在 Clojure 中功能性地处理用户输入验证

clojure - 为具有跨层约束的嵌套数据结构创建 Clojure 规范生成器

clojure - 打印 seq 中每个项目之间的逗号

clojure - assoc-in with two elements 和 update/assoc 的区别

functional-programming - 组织Clojure代码

java - 从没有破折号的字符串创建 UUID

clojure - 在 Clojure 中对向量实现双循环的惯用方法是什么?

namespaces - 在 Clojure 中使用命名空间的常见约定有哪些?