Macros Clojure引用混乱

Macros Clojure引用混乱,macros,clojure,lisp,Macros,Clojure,Lisp,很抱歉,标题非常模糊:) 我不熟悉宏,很难理解这两种语句之间的区别: `(+ 1 2 ~(+ 2 3)) ; => (clojure.core/+ 1 2 5) '(+ 1 2 ~(+ 2 3)) ; => (+ 1 2 (clojure.core/unquote (+ 2 3))) 当我在没有取消报价的情况下运行它们时,它们除了排位赛之外似乎完全相同 `(+ 1 2 (+ 2 3)) ; => (clojure.core/+ 1 2 (clojure.core/+ 2 3)

很抱歉,标题非常模糊:)

我不熟悉宏,很难理解这两种语句之间的区别:

`(+ 1 2 ~(+ 2 3)) ; => (clojure.core/+ 1 2 5)
'(+ 1 2 ~(+ 2 3)) ; => (+ 1 2 (clojure.core/unquote (+ 2 3)))
当我在没有取消报价的情况下运行它们时,它们除了排位赛之外似乎完全相同

`(+ 1 2 (+ 2 3)) ; => (clojure.core/+ 1 2 (clojure.core/+ 2 3))
'(+ 1 2 (+ 2 3)) ; => (+ 1 2 (+ 2 3))
所以基本上我被“vs”搞糊涂了。我的理解是,他们都引用了列表中的所有内容,这就是为什么我不确定为什么取消引用的行为会有所不同。基本上,“和”的行为都是我所期望的


谢谢

简单的回答是,取消报价只在反向报价中有效。在正常引用的表达式中,所有内容(包括
~
和内部/后面的所有内容)都按原样传递,而在反向引用的表达式中,内部/后面的所有内容都将进行求值(但其他所有内容都保持未求值状态)。因此,不,并不是反引号表达式中的所有内容都保持未计算状态–您可以在其内部使用
~
,将其用作一种模板,在其中使用
~
来“填充空格”

编辑:引用(双关语)与您的问题相关的内容:

引述:

Quote (')
'form => (quote form)
及(摘自该节):

(报价表)生成未估价的表格

注意:没有尝试调用函数a。返回值 是一个包含3个符号的列表

语法引号(也称为准引号、反引号):

对于列表/向量/集合/映射,syntax quote建立了 相应的数据结构。在模板中,不合格 表单的行为就像递归引用语法一样,但表单可以 通过使用unquote对其进行限定而免于此类递归引用 或取消拼接,在这种情况下,它们将被视为表达式 并在模板中用其值或值序列替换, 分别


尝试对前两个表达式的结果运行
eval
。第一个带“,”的扩展到
(+123)
,很好地计算为6。第二个,带“,”扩展到
(+12(unquote(+12)))
,而unquote在该上下文中无效,因为您不再位于quote中!所以这完全无法评估

“和”之间基本上有两个区别:

  • `名称空间限定了一切
  • `允许取消引用

你也可以提到这家伟大的报纸。Daimrod,是的,谢谢你的链接!(初学者注意:其他Lisp方言和Clojure之间有一些区别。例如,在CL和论文中,
(Clojure中的空格)用于取消引号。此外,在CL中,
外的反引号表达式无效(通常是读者错误)。)谢谢,我不知道取消引号是为语法引号保留的。这绝对解释了结果。我正在经历《Clojure的欢乐》,我在宏一章中停下来进行实验,试图理解这些东西,所以我可能错过了本章中进一步的解释:)
user=> '(a b c)
(a b c)