Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果';在clojure中,x的计算结果为(var x),为什么不是';他们不平等吗?_Clojure - Fatal编程技术网

如果';在clojure中,x的计算结果为(var x),为什么不是';他们不平等吗?

如果';在clojure中,x的计算结果为(var x),为什么不是';他们不平等吗?,clojure,Clojure,在O'Reilly的“Clojure编程:Java世界的实用Lisp”中,有一句话: var特殊表单执行以下操作: 您已经多次看到变量是如何在REPL:#中打印的,后面跟着一个符号。这是扩展为调用var的读取器语法: (Kindle位置1278-1282) 但事实似乎并非如此。我认为类型是一样的 [user]> (def x 5) #'user/x [user]> (= 'x (var x)) false [user]> (type 'x) #<Class@c540f

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

var特殊表单执行以下操作:

您已经多次看到变量是如何在REPL:#中打印的,后面跟着一个符号。这是扩展为调用var的读取器语法:

(Kindle位置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
[user]>(def x 5)
#'用户/x
[用户]>(='x(变量x))
假的
[用户]>(键入“x”)
#
[用户]>(类型(变量x))
#
[用户]>'x
x
[用户]>(变量x)
#'用户/x
您缺少
#
符号:

(def x 5)
(spyx (var x))
(spyx #'x)

(var x) => #'tst.clj.core/x
(var x) => #'tst.clj.core/x
clojure阅读器使用源文件中的字符,并在到达编译器之前替换
#'x
=>
(var x)
。如上所述,
spyx
宏(“spy表达式”)甚至看不到原始的
#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
宏,则需要将其添加到
项目中。clj

   [tupelo "0.9.19"]
您缺少
#
符号:

(def x 5)
(spyx (var x))
(spyx #'x)

(var x) => #'tst.clj.core/x
(var x) => #'tst.clj.core/x
clojure阅读器使用源文件中的字符,并在到达编译器之前替换
#'x
=>
(var x)
。如上所述,
spyx
宏(“spy表达式”)甚至看不到原始的
#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
宏,则需要将其添加到
项目中。clj

   [tupelo "0.9.19"]

您可以通过检查简单引用输入的结果来更清楚地演示读取时间替换:
'[(var x)#'x]
。啊,谢谢。你知道,我想我弄糊涂了,认为
是一个提示。你可以通过简单地引用输入的结果来更清楚地演示读取时间替换:
'[(var x)#'x]
。啊,谢谢。你知道,我想我弄糊涂了,认为
是一个提示。
'x
的计算结果是
(quote x)
,而不是
(var x)
<代码>(='x(引号x))计算结果为
true
x
只是一个符号。它不需要引用
var
或任何其他内容。
'x
的计算结果为
(引号x)
,而不是
(var x)
<代码>(='x(引号x))计算结果为
true
x
只是一个符号。它不需要引用
var
,或任何其他内容。