Clojure 多语法引号

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。您缺少评估步骤 让我们先看一下简单的引语

`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
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
等)组成,用于将模板部件与评估位组装在一起。如果您再次引用,您将看到这些函数调用表单。

您的问题是什么?这里有一个很好的资源,可以帮助您了解引用的行为