Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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
Syntax Clojure-引号和语法引号之间的区别_Syntax_Clojure_Quote - Fatal编程技术网

Syntax Clojure-引号和语法引号之间的区别

Syntax Clojure-引号和语法引号之间的区别,syntax,clojure,quote,Syntax,Clojure,Quote,有人能解释一下它是如何一步一步计算的吗?单引号运算符返回您正在引用的表达式或符号,而不进行计算。syntax quote运算符返回要引用的表达式或符号(添加名称空间),而不计算它。可以说,syntax unquote操作符“取消”了syntax quote操作符,但不是单引号。您可以嵌套语法引号和语法取消引号来执行奇怪而奇妙的壮举。我读到的最喜欢的类比是理解语法引用和语法引用作为梯子上下移动的梯级()。 在`x的形式中,x被语法引用,因此不进行计算;相反,您会得到一个名称空间符号(如user/x

有人能解释一下它是如何一步一步计算的吗?

单引号运算符返回您正在引用的表达式或符号,而不进行计算。syntax quote运算符返回要引用的表达式或符号(添加名称空间),而不计算它。可以说,syntax unquote操作符“取消”了syntax quote操作符,但不是单引号。您可以嵌套语法引号和语法取消引号来执行奇怪而奇妙的壮举。我读到的最喜欢的类比是理解语法引用和语法引用作为梯子上下移动的梯级()。 在
`x
的形式中,
x
被语法引用,因此不进行计算;相反,您会得到一个名称空间符号(如
user/x
)。但是在
`~x
形式中,
x
再次被语法取消引用,因此它被计算为:

(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)
关于你的例子:

示例1

只是
(引用…
)的糖

所以,
“~x
变成了
(引用`~x)
。这又变成了
(quote x)
(记住
`
实际上什么都不做),这就是为什么整个表达式的计算结果是符号
x

示例2

`x
中,让我们首先将
'
替换为
quote
`(quote~x)
。表达式的语法被引用,因此不会对其求值

因此,您可以将表达式
(quote~x)
视为“中间步骤”。但我们还没有完成
x
在syntax引号内是syntax unquote,正如上面的示例所示。因此,即使这个表达式作为一个整体不会被计算,
x
将被计算,它的值是
1
。最后,您将得到表达式:
(引号1)


关于这个话题

你的意思是等于
1
。阶梯隐喻@galdre是指“掌握Clojure宏”@Chiron谢谢。我不记得在哪里见过它。
user=> `~x
1