【问题标题】:Clojure Vars vs. Pointers/References in Other LanguagesClojure Vars 与其他语言中的指针/引用
【发布时间】:2016-06-02 05:45:40
【问题描述】:

我正在尝试理解 Var 的 clojure 概念。

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

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

鉴于类似

(def v 7)

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

【问题讨论】:

标签: clojure


【解决方案1】:

是的,这是一个很好的概念。我会稍微调整你的最后陈述: #'v 扩展为 (var v),说 var (var v) 是没有意义的,而我只会说 var v。另外我会说 derefs 为值 7 而不是指向。是的,它们的行为类似于指针,但它们有一个特殊的deref(或@)形式来取消引用它们(而且你不能做指针算术)。

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

关键是,在考虑指针时,您可能会倾向于将 inc 视为某个 var 指向的函数。这是不正确的。 inc 是与引用函数的 var 关联的符号。使用 var inc 时,为了方便起见,它会自动解析为该函数。从这个意义上说,您可以争辩说仅将 v derefs 表示为值 7 是准确的。 v 是一个 var,您实际上不需要指定它。 (显然,当你试图明确指出它是一个 var 时,它是有意义的,所以称它为 var 也没有错)。

【讨论】:

  • “你必须使用 alter-var-root 来设置它们”这是错误的 - 你可以使用 intern 或 def 设置变量,也可以使用其他方法
  • 哭笑不得!感谢您的更正。我删除了不正确的陈述。如果仍然不太正确,请直接编辑答案。我认为添加对 alter-var-root、def 和 intern 的解释会很有用。再次感谢您显示错误,我已经删除了我之前的评论,因为它是错误的,我不想分散读者的注意力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多