我对clojure instance?函数有点困惑.采取一个论点似乎很高兴.所以
(instance? String)
Run Code Online (Sandbox Code Playgroud)
工作正常,但总是返回false.
我在这里错过了什么吗?我在两天内完成了两次,两次都花了很长时间才进行调试(是的,我同意,犯错一次可能会被视为不幸,但两次看起来像粗心大意).
为什么不打破,有一个arity错误?
注释后来添加:从Clojure 1.6开始,这已得到修复!
有意思......即使instance?定义了core.clj,似乎内置了特殊clojure.lang.Compiler的(instance?)表格处理.
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从而调用定义的函数.