如果'x在clojure中评估为(var x),为什么它们不相等?

时间:2017-01-19 01:01:19

标签: clojure

在O'Reilly的“Clojure编程:Java世界的实用Lisp”中,有一个声明:

  

var特殊形式执行此操作:

(def x 5)
(var x) 
;= #' user/x 
  

你现在已经多次看到如何在REPL中打印变量:#',后跟一个符号。这是扩展为对var:

的调用的读者语法
 #'x 
 ;= #' user/x
  

(Kindle Locations 1278-1282)。

似乎并非如此。我认为类型类型是相同的。

[user]> (def x 5)
#'user/x

[user]> (= 'x (var x))
false

[user]> (type 'x)
#<Class@c540f5a clojure.lang.Symbol>

[user]> (type (var x))
#<Class@77e9807f clojure.lang.Var>

[user]> 'x
x

[user]> (var x)
#'user/x

1 个答案:

答案 0 :(得分:5)

您缺少[attns]符号:

#

clojure阅读器使用源文件中的字符,并替换(def x 5) (spyx (var x)) (spyx #'x) (var x) => #'tst.clj.core/x (var x) => #'tst.clj.core/x =&gt; #'x甚至在它到达编译器之前。如您所见,(var x)宏(“间谍表达式”)甚至看不到原始spyx表达式 - 替换已经发生。

因此我们得到:

#'x

您也可以尝试:

(= #'x (var x)) => true

如果您希望使用(println "type 1: " (type (var x))) (println "type 2: " (type #'x)) ;=> type 1: clojure.lang.Var ;=> type 2: clojure.lang.Var spyspyx宏,则需要将其添加到spyxx

project.clj