我有点迷惑的clojure实例?功能.看起来很高兴采取单一的观点.所以
(instance? String)
工作正常,但总是返回false.
我在这里遗漏了什么吗?我在两天内完成了两次,两次都花了相当长的时间来调试(是的,我同意,一旦将错误视为不幸,但是两次看起来不小心).
为什么不破坏,有一个无礼的错误?
备注补充:
截至Clojure 1.6已经修复了!
@L_502_0@
有趣…即使实例?在core.clj中定义,对于(instance?)形式,clojure.lang.Compiler中内置的特殊处理似乎也是如此.
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))); } }
我解释说,当你编译/评估一个(实例?)形式时,core.clj中定义的函数被忽略,有利于硬连线的行为,这将把缺少的第二个参数解释为nil.我猜这是为了表现的原因,作为一种衬里.
显然,这种特殊处理仅适用于某些情况(我不熟悉编译器知道它们是什么).如Ankur的答案所示,有没有办法调用实例?这将导致在core.clj中定义的函数被调用.