〜'取消引用' vs正常引用clojure中的变量?

时间:2017-10-03 20:58:56

标签: 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

2 个答案:

答案 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