如何解决clojure中带有第一个自变量引用的列表的值是最后一个自变量?
为什么要表达
('+ 10 20)
评估为20
?这对我来说真的很奇怪!我本来希望给出一个错误,因为列表的第一个元素'+
我不是可以评估的东西!
解决方法
这几乎是Clojure的常见问题解答,无论好坏。因此'+
是(quote +)
的简写,其结果为符号+
。符号(和关键字)可以视为函数,并在其参数中查找它们本身,因此('+ 10 20)
本质上是(get 10 '+ 20)
,这就是not-found
的{{1}}别名,因此,如果“集合” get
不包含符号10
,则它将返回第三个参数'+
。
您可能期望针对20
的关联查询失败并引发异常,但是在Clojure中有很多情况会导致查询返回10
(或nil
版本),因为它是从not-found
的攻击角度来看是有益的,并且是导致惯用的Clojure的一部分。
某些函数 do 执行此类参数检查:例如,nil
将引发异常,而(contains? 10 '+)
和(get 10 '+)
都将返回{ {1}}。
可能还值得注意的是以下内容引发异常:
(get '+ 10)
您问“在clojure中带有引号的第一个参数的列表的值是否是最后一个参数”,而答案是否定的,这是非常具体的两参数函数调用,因为上面的逻辑:您不能“调用”一个具有3个参数,只有1或2的符号。
值得一提的是0 args情况的区别:
nil
第一种情况是符号查找-它至少需要一个集合才能在其中查找自身-而第二种情况是具有零参数的函数调用(user=> ('+ 10 20 30)
Execution error (ArityException) at user/eval39476 (REPL:1).
Wrong number of args (3) passed to: clojure.lang.Symbol
),该函数调用返回标识值user=> ('+)
Execution error (ArityException) at user/eval39478 (REPL:1).
Wrong number of args (0) passed to: clojure.lang.Symbol
user=> (+)
0
中的clojure.core/+
返回+
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。