user=> ((symbol "or") true false)
false
user=> (or true false)
true为什么第一种形式要评估为false?我认为这两种输入形式是等价的。
奇怪的是,颠倒论点的顺序是有效的:
user=> ((symbol "or") false true)
true
user => (or false true)
true发布于 2016-02-21 21:14:01
计算列表(or true false)时,Clojure首先计算第一个项。在本例中,第一项是命名宏的符号,因此Clojure扩展宏并计算结果数据结构(在本例中为let表单)。
另一方面,当您计算list ((symbol "or") true false)时,Clojure再次计算第一个项,但在本例中,第一个项是另一个列表!该列表的第一个元素是符号symbol,它命名了一个函数,因此Clojure用参数"or"调用该函数,再次生成符号or。换句话说,您基本上是在评估('or true false)。
这里有一个问题: Clojure不接受它刚刚评估的东西,然后再对它进行评估。相反,因为它一开始并不是一个符号,Clojure对它进行了计算,然后假设它必须是一个函数。是一种功能吗?事实上,答案是肯定的!
user> (ifn? 'do)
;=> true这里有点棘手。invoke在Symbol类上的实现与Keyword类上的invoke实现相同:它假定第一个参数是一个映射,并试图在该映射中查找自己。如果提供第二个参数,它将使用该参数作为默认值。
现在,很明显,如果您尝试将true看作一个映射,并在该地图中查找符号or,您将什么也找不到。因此,Clojure可以帮助返回您提供的默认值:false。您可以在第二个参数点中放置任何您想要的值,只要您的符号在第一个参数中不作为键存在,您将始终得到默认值。
https://stackoverflow.com/questions/35541931
复制相似问题