clojure实例?单一论点

Phi*_*ord 13 clojure instance

我对clojure instance?函数有点困惑.采取一个论点似乎很高兴.所以

(instance? String) 
Run Code Online (Sandbox Code Playgroud)

工作正常,但总是返回false.

我在这里错过了什么吗?我在两天内完成了两次,两次都花了很长时间才进行调试(是的,我同意,犯错一次可能会被视为不幸,但两次看起来像粗心大意).

为什么不打破,有一个arity错误?

注释后来添加:从Clojure 1.6开始,这已得到修复!

http://dev.clojure.org/jira/browse/CLJ-1171

Ale*_*lex 8

有意思......即使instance?定义了core.clj,似乎内置了特殊clojure.lang.Compiler(instance?)表格处理.

Compiler.java,第3498行:

    if(fexpr instanceof VarExpr && ((VarExpr)fexpr).var.equals(INSTANCE))
        {
        if(RT.second(form) instanceof Symbol)
            {
            Class c = HostExpr.maybeClass(RT.second(form),false);
            if(c != null)
                return new InstanceOfExpr(c, analyze(context, RT.third(form)));
            }
        }
Run Code Online (Sandbox Code Playgroud)

我将其解释为,当您编译/评估(instance?)表单时,将core.clj忽略定义的函数,以支持硬连线行为,这会将缺少的第二个参数解释为nil.我猜这是出于性能原因,作为一种内在的方式.

显然,这种特殊处理仅适用于某些情况(我对编译器不够熟悉,不知道它们是什么).正如Ankur的回答所示,有一些方法可以调用instance?,core.clj从而调用定义的函数.