Clojure - 引用和语法引用之间的区别

时间:2014-10-21 11:25:03

标签: syntax clojure quote

(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)

有人可以解释一下如何逐步评估它吗?

1 个答案:

答案 0 :(得分:14)

单引号运算符返回您引用的表达式或符号,而不进行评估。 syntax-quote运算符返回您引用的表达式或符号(添加了名称空间),而不对其进行评估。语法 - 取消引用运算符“取消”语法引用运算符,可以这么说,但不是单引号。你可以嵌套语法引用和语法 - unquotes来执行奇怪和奇妙的功能。我读到的最喜欢的类比是将语法引用和语法不引用视为向上移动梯形梯级(possible source)。

`x格式中,x是语法引用的,因此不会对其进行评估;相反,你得到一个命名空间符号(如user/x)。但是在`~x形式中,x再次被语法取消引用,因此会对其进行评估:

user=> `~x
1

关于你的例子:

示例1

'只是(quote ...)的糖。

因此'`~x变为(quote `~x)。这反过来变为(quote x)(请记住`~并没有真正做任何事情),这就是为什么整个表达式的结果是符号x

示例2

`'~x中,我们首先将'替换为quote`(quote ~x)。该表达式是语法引用的,因此不会被评估。

因此,您可以将表达式 (quote ~x)视为“中间步骤”。但我们还没有完成。语法引用中的x是语法不引用的,就像我上面的例子中一样。因此,即使整个表达式不会被评估,x也将是1,其值为(quote 1)。最后,您得到表达式:{{1}}。

关于这个主题的

Blog post