在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
答案 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
,spy
或spyx
宏,则需要将其添加到spyxx
:
project.clj