作为一种将代码作为数据进行操作的练习,我想采用一段Clojure代码并更改bar
次foo
次调用的(= foo foo) ;returns true
(= foo (first `(foo))) ;returns false
次调用。但我在检查功能平等方面遇到了困难。我的问题是:
<div id="section" class="format" align="left"></div>
检查第二次平等的正确方法是什么?
答案 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。