興味深い...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)));
}
}
これは、フォームをコンパイル/評価するときに、(instance?)
で定義された関数core.clj
が無視され、2 番目の引数の欠落を として解釈するハードワイヤードな動作が優先されることを意味すると解釈しnil
ます。これは、一種のインライン化として、パフォーマンス上の理由から行われていると思います。
どうやら、この特別な処理は特定の場合にのみ適用されるようです (そして、私はそれらが何であるかを知るほどコンパイラに精通していません)。Ankur の回答に示されているようにinstance?
、で定義された関数を呼び出す方法がcore.clj
あります。