【问题标题】:What does IFn in Clojure stand for?Clojure 中的 IFn 代表什么?
【发布时间】:2016-07-29 15:15:01
【问题描述】:

在 Clojure 的 Java 源代码中,我看到了:

import clojure.lang.RT;
import clojure.lang.IFn;

RT 似乎代表“运行时”(尽管答案中没有给出官方来源:In the clojure source code, what does RT stand for?

但是IFn 代表什么?

【问题讨论】:

  • IFn 是所有编译的 Clojure 函数都遵循的接口。对 Clojure 函数的调用编译为对其IFn 接口的许多invoke 方法之一的调用。

标签: java clojure


【解决方案1】:

IFn 表示I界面Fun动作。 Clojure 对 Java 接口使用大写的“I”前缀,对 Java 抽象类使用“A”。

另请参阅IFn JavadocIFn source

【讨论】:

    【解决方案2】:

    在 clojure 的术语中,fnifn 之间还有一个区别:

    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? 测试某物是否属于 fn 返回的对象类型。
    • :keyword 是非常实际的,如果我们谈论它是 callability,但它的类型仍然是keyword,所以它显然不是一个函数。
    • 抱歉,没有。说关键字不是 Clojure 的具体 Fn 类型的成员是正确的,但说 Fn 而不是 IFn 确定某物是否是“实际功能”则适得其反。 This answer 很好地解释了这个观点。
    • 对不起,你没有说服我。 “具有函数语义的事物”和“函数”是不同的事物。首先在代码层面:当你在源代码中看到一个hashmap时,你不会认为它是一个函数,而是说“一个hashmap,可以用作函数”。那是我的观点。而“实际函数”我的真正意思是“匿名或绑定 lambda 表达式”。因此,考虑到这些术语,它与 Fn/IFn 类型术语中的说法一样正确。无论如何,为此争论是没有用的。
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2019-04-28
    • 2012-08-11
    相关资源
    最近更新 更多