按名称检查Clojure函数是否相等

时间:2017-04-02 00:34:56

标签: clojure lisp

作为一种将代码作为数据进行操作的练习,我想采用一段Clojure代码并更改barfoo次调用的(= foo foo) ;returns true (= foo (first `(foo))) ;returns false 次调用。但我在检查功能平等方面遇到了困难。我的问题是:

<div id="section" class="format" align="left"></div>

检查第二次平等的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

原因是你引用了这个清单:

int main() {
    int v[] = {0,10,45};

    for (auto& x : v) { // Since it IS an alias it will alter `v` array's contents.
        std::cout << ++x << ' '; // Output: 1, 11, 46
    }

    for (auto x : v) {
        std::cout << x << ' ';   // Output: 1, 11, 46 MODIFIES v
    }        
}

答案 1 :(得分:0)

答案是clojure中的符号是特殊的:它们会自动执行变量替换。

如果您的原始问题使用了关键字或字符串,那么它可以完美运行:

(= "foo" (first ["foo"])))     => true
(= :foo  (first [:foo ])))     => true

(= "foo" (first '("foo") )))   => true
(= :foo  (first '(:foo ) )))   => true

请注意,我们需要引用该列表以关闭它的默认含义&#34;函数调用&#34;。

同样,符号的默认解释为&#34;变量替换&#34;:

(def doh 5)
(= 5 doh)   => true

如果我们想将符号doh视为一段数据,我们需要引用它来关闭默认行为:

(= (symbol "doh") 'doh)   => true

注意:使用单引号递归引用引用表单中的所有内容。这意味着我们可以关闭&#34;功能调用&#34;括号的行为和变量替换&#34;只有一个单引号字符的符号行为:

(=         'foo    (first '(foo)))   => true
(= (symbol "foo")  (first '(foo)))   => true

请注意,symbol函数会将常规文本字符串转换为符号。

最后,请注意单引号字符只是the Clojure Reader中&#34;函数&#34;的快捷方式。名为quote

(= (quote foo)  (first '(foo)))   => true

quote实际上是一种 特殊形式 ,而不是一种功能。这意味着它内置于编译器中,并且不遵循函数的常规规则。否则,它将自动执行变量替换,上面的内容将如下所示:

(= (quote 5) (first '(foo)))   => false

请注意(quote 5)5都与编译器相同。由于整数5不等于包含符号foo的length-1列表的第一项,因此表达式为false。