Clojure 多语法引号
`a``a和``a给出了以下结果Clojure 多语法引号,clojure,Clojure,`a``a和``a给出了以下结果 user=> `a user/a user=> ``a (quote user/a) user=> ```a (clojure.core/seq (clojure.core/concat (clojure.core/list (quote quote)) (clojure.core/list (quote user/a)))) 由于`a给出了user/a,我认为`a与`user/a相同,即user/a。您缺少评估步骤 让我们先看一下简单的引语
user=> `a
user/a
user=> ``a
(quote user/a)
user=> ```a
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote quote)) (clojure.core/list (quote user/a))))
由于`a给出了user/a,我认为`a与`user/a相同,即user/a。您缺少评估步骤 让我们先看一下简单的引语:
user=> 'a
a
user=> ''a
(quote a)
user=> '''a
(quote (quote a))
user=> ''''a
(quote (quote (quote a)))
等等。这非常简单,因为它不需要以任何方式处理引用的表单,只需要读取它
'a
读作(引号a)
,其计算结果为符号a
“a
读作”(quote a)
,读作(quote(quote a))
,其计算结果为列表(quote a)
,该列表包含两个符号quote
和a
等等
现在,什么是`
做的而做不到的?这或多或少是一种模板机制
- 自动限定符号
- 自动处理自动gensym
- 评估由
~
(或~@
)标记的内容并重新插入结果
这意味着它不能只生成另一个包含以下表单的quote
表单,而必须在调用站点生成一个实际的函数调用表单(除了在普通情况下)。此表单主要由序列操作(list
、cons
、concat
等)组成,用于将模板部件与评估位组装在一起。如果您再次引用,您将看到这些函数调用表单。您的问题是什么?这里有一个很好的资源,可以帮助您了解引用的行为