我一直在玩clojure一段时间。但是无法弄清楚~
与normal reference
之间的区别。
例如:
(defn f [a b] (+ a b))
(f 1 2)
输出:
3
另一方面:
(defn g [a b] `(+ ~a ~b))
(g 1 2)
输出:
(clojure.core / + 1 2)
所以我的问题是what's need for different syntax
?
答案 0 :(得分:4)
有一种名为" syntax-quote"的语言功能。这提供了一些语法快捷方式,围绕形成看起来像clojure表达式的列表。您不必使用它来构建作为clojure s表达式的列表,您可以使用它构建您想要的内容,尽管它几乎总是在作为宏的一部分的代码中使用。那个宏需要构建一个Clojure s-expression并返回它。
所以你的例子
(defn g [a b] `(+ ~a ~b))
当Clojure读者读取它时会运行语法引用reader macro(名为`
)
而syntax-quote宏将采用列表
(+ ~a ~b)
作为它的参数并返回列表
(+ 1 2)
因为它将符号~
解释为"包含在我们正在构建的列表中,这是评估下一件事的结果" 。
答案 1 :(得分:0)
反引号符号`和波浪号~
通常仅在编写宏时使用。在使用defn
等编写正常函数时,您不应该正常使用它们。
您可以在其他书籍中找到more information here。