6

文字列のsrcを調べていましたか?fnといくつかの質問がありました。以下はstring?fnのソースです-

(def
 ^{:arglists '([x])
   :doc "Return true if x is a String"
   :added "1.0"
   :static true}
 string? (fn ^:static string? [x] (instance? String x)))
  1. fn 静的メタデータを与えるとどうなりますか?
  2. 静的メタデータが 2 回与えられるのはなぜですか? fn または var のいずれかを指定するだけで十分ではありませんか?
  3. 匿名の fn に名前があるのはなぜですか?
4

1 に答える 1

4

1. および 2. に対する回答については、質問に対する djsheldrick のコメントを参照してください。3.への答え:

まず、これはここでは関係ありませんが、名前付き関数は名前で自分自身を参照できます。これにより、値として自分自身を返すか、トップではなく通常の呼び出しメカニズムを介して自分自身を呼び出すことができますrecur。重要なことに、これは遅延 seq を生成する関数の正しい自己呼び出し戦略です。以前のSOの回答で理由を説明しました(「遅延シーケンスで再帰呼び出しをラップできるのはなぜですか...」ブロック引用の後の部分を参照してください)。

次に、関数が JVM クラスにコンパイルされます。クラスは、関数に名前が付けられていない場合、関数が定義されている名前空間に基づいて Clojure コンパイラによって名前が付けられます。それ以外の場合、その名前はクラスのより意味のある名前を生成するために使用されます。これは、スタック トレースがよりわかりやすくなるため、デバッグに役立ちます。

于 2013-04-11T20:32:36.843 に答える