clojure 中向量前面的引号是什么意思?

Dav*_*vid 1 clojure

假设您在 clojure 中有以下代码行。您需要报价做什么?

(require '[clojure.string :as str])
Run Code Online (Sandbox Code Playgroud)

dor*_*rab 9

报价可以防止评估。默认情况下,所有表达式都在 Clojure 中计算。在表达式前面使用引号会阻止计算。 Clojure 中的大多数表达式都是自求值(它们对自身求值)。两个主要的例外是符号和列表。 编辑:请参阅下面@amalloy 的评论和回复。

在本例中,引用创建一个文字向量,其第一个元素是符号clojure.string,第二个元素是关键字:as,第三个元素是符号str

如果没有引号,(require [clojure.string :as str]), 将尝试计算符号clojure.stringstr,并且该值将是绑定到这些符号的 var 包含的任何值(如果没有任何绑定,则为错误)。

这是一个展示差异的示例。假设您有以下两个def

(def a 16)
(def b 12)
Run Code Online (Sandbox Code Playgroud)

现在,'[a 14 b]将计算向量[a 14 b]。但是,[a 14 b]会评估为[16 14 12].

有关如何在 Clojure 中解析符号的详细信息,请参阅评估部分。clojure.org

您可能还会发现quote文档以及 Clojure语法部分很有帮助。

  • Nit:我认为说大多数表达式都会计算自身是没有用的。事实上,很少有自我评估:大部分只是关键词和数字。最相关的是,向量不会对自身求值:如果它这样做,您就不需要在这个答案中引用!相反,评估向量需要评估其元素并将它们放入向量中。 (2认同)