【问题标题】:What's the difference between var and quote?var 和 quote 有什么区别?
【发布时间】:2011-05-21 05:28:53
【问题描述】:

Clojure 中的 var 和 quote 有什么区别?例如,(var a)(quote a)

官方网站有以下文档,但是var对象和符号的值有什么区别?我很困惑。

(变量符号) 符号必须解析为 var,并返回 Var 对象本身(而不是其值)

【问题讨论】:

  • 考虑添加quote 的定义。这应该是有道理的。

标签: clojure


【解决方案1】:

(quote a) 返回一个符号 (clojure.lang.Symbol) - 它的作用与 'a 相同。值得阅读更多关于Clojure reader 的信息,以了解更多关于符号的信息。示例:

(quote a)
=> a

(var a) 返回当前命名空间中符号 a 表示的 var (clojure.lang.Var)。如果 a 未在当前命名空间中定义,您将收到错误消息。示例:

(var a)
=> #<CompilerException java.lang.RuntimeException: Unable to resolve var: a in this context, compiling:(NO_SOURCE_PATH:1)>

(def a 1)
(var a)
=> #'user/a

这是技术定义 - 但这是其背后的直觉:符号是名称,可用于在给定名称空间中查找 var。 var 本身是一种引用,可以保存任何类型的 Clojure 值。所以一个符号标识一个包含一个值的变量。

【讨论】:

    【解决方案2】:

    考虑一下:

    ; #'x a reader short-cut for (var x), and 'x is a short-cut for (quote x)
    (def x)
    (binding [x 1] (var-set #'x 2) (list (var x) (quote x) x)) 
    

    计算结果类似于(添加了 cmets)

    (
     #'sandbox177857/x ; the variable itself - was passed to var-set
     x                 ; the symbol x. same as 'x
     2                 ; last value in #'x
    )
    

    set! 将接受(除其他外)一个 Var 或解析为全局名称的符号(var-set 将只接受一个 Var)。 (var-set x ...) 不起作用的原因是这会导致传入 x 的值(而不是名为 x 的 Var)。

    希望这会有所帮助。编码愉快。

    【讨论】:

    • 感谢您的回答。看起来 Var 对象是符号名称和它的值之间的直接层,对吗?
    • @Thomson 这是一种“谈论”具有给定名称的变量的方式。在 C 语言中,这不是必需的:x = x + 1; 第一个 x 是一个左值并且未计算。因此 Clojure 中的 Var 可以更强大,因为它们本身可以作为值传递; C 需要指针乐趣。此外,由于 Var 在作用域中与名称分离,它可以通过不同的词法作用域传递,这些词法作用域可能有自己的“x”变量——但 Var 始终是它自己。
    • 此外,我无法直接运行您的示例程序来检查结果。我得到“CompilerException System.Exception: Unable to resolve var: x in this context”。但是如果我在示例之前添加一个 (def x 3) ,它也会产生异常。
    • @pst,谢谢。你修好了吗?我仍然无法通过简单的复制和粘贴来运行它。还是出现“InvalidOperationException Can't dynamic bind non-dynamic var: user/x”
    • @Thomson :对,Var 是一个间接层。它是一种用于管理状态的构造,就像 refs、agents、atoms 一样。所以 var 是一个可以设置值的框。 vars 的区别属性是能够在每个线程的基础上动态绑定一个新值(开箱即用的 clojure
    猜你喜欢
    • 2019-09-21
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多