~ "取消引号"与对 clojure 中变量的正常引用?



我已经玩了一段时间的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等编写普通函数时,通常不应该使用它们。

您可以在此处和其他书籍中找到更多信息。

最新更新