在为Clojure的Java源代码,我已经看到了:Clojure中的IFn代表什么?
import clojure.lang.RT;
import clojure.lang.IFn;
RT
似乎代表“运行时”(虽然没有官方消息是在回答给定:In the clojure source code, what does RT stand for?)
但什么IFn
代表什么?
在为Clojure的Java源代码,我已经看到了:Clojure中的IFn代表什么?
import clojure.lang.RT;
import clojure.lang.IFn;
RT
似乎代表“运行时”(虽然没有官方消息是在回答给定:In the clojure source code, what does RT stand for?)
但什么IFn
代表什么?
接口函数。 Clojure使用Java接口的大写“I”前缀和Java抽象类的“A”。
见Clojure的方面也有fn
和ifn
之间多了一个区别:
user> (defn f [x] x)
#'user/f
user> (map fn? [f #(list %) :keyword 'sym {:a 10} #{123} [1 2 3] 10 "asd"])
(true true false false false false false false false)
user> (map ifn? [f #(list %) :keyword 'sym {:a 10} #{123} [1 2 3] 10 "asd"])
(true true true true true true true false false)
所以,你可以看到fn?
仅用于实际的作用真的,而ifn?
如果对任何事情都成立,那可能是称为功能(如关键字,地图等)
“fn?'仅适用于实际功能”的区别是误导性的。 ':keyword'与'#(list%)'一样是一个“实际功能”。更准确的说法是['fn?'](https://clojuredocs.org/clojure.core/fn_q)测试是否有['fn']返回的对象的类型(https:/ /clojuredocs.org/clojure.core/fn)。 –
:关键字与实际一样多,如果我们谈论它的* callability *,但它的类型仍然是'keyword',所以它显然不是函数。 – leetwinski
对不起,但没有。说一个关键字不是Clojure的具体'Fn'类型的成员是正确的,但是说'Fn'而不是'IFn'确定某个事物是否是“实际函数”是适得其反的。 [这个答案](http://stackoverflow.com/a/6916532/5044950)在解释这个观点方面做得很好。 –
'IFn'是所有编译的Clojure函数都符合的接口。对Clojure函数的调用会编译为其IFn接口的许多invoke方法中的一个。 – Thumbnail