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中!所以这完全无法评估
“和”之间基本上有两个区别:
- `名称空间限定了一切
- `允许取消引用
,
(Clojure中的空格)用于取消引号。此外,在CL中,,
外的反引号表达式无效(通常是读者错误)。)谢谢,我不知道取消引号是为语法引号保留的。这绝对解释了结果。我正在经历《Clojure的欢乐》,我在宏一章中停下来进行实验,试图理解这些东西,所以我可能错过了本章中进一步的解释:)
user=> '(a b c)
(a b c)