我已经玩了一段时间的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
?
有一种称为"语法引用"的语言功能,它提供了一些语法快捷方式,用于形成看起来像 clojure 表达式的列表。您不必使用它来构建 clojure s 表达式的列表,您可以使用它构建您想要的内容,尽管它几乎总是用于作为宏一部分的代码中。该宏需要构建一个 Clojure s 表达式并将其返回的地方。
所以你的例子
(defn g [a b] `(+ ~a ~b))
当它被 Clojure 读取时,读取器将运行语法引号读取器宏(名为`
),
并且该语法引号宏将获取列表
(+ ~a ~b)
因为它是参数并返回列表
(+ 1 2)
因为它将符号~
解释为"包含在我们正在构建的列表中,评估下一件事的结果"。
反引号' 和波浪号~
通常只在编写宏时使用。在使用defn
等编写普通函数时,通常不应该使用它们。
您可以在此处和其他书籍中找到更多信息。