2013-04-11 4 views
6

文字列のsrcを見ていましたか? fnといくつかの質問があった。やる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. - 以下はstring? FNの源は何ですか?
  2. なぜ静的メタデータが2回与えられるのですか?fnまたはvarのどちらかに指定するだけで十分ではありませんか?
  3. なぜ匿名のFnに名前がありますか?
+3

1.ここで回答しました:http://stackoverflow.com/questions/7552632/what-does-static-do-in-clojure –

答えて

4

1.と2.への回答については、d.j.sheldrickの質問に対するコメントを参照してください。 3への答え。

最初に、これはここでは関係ありませんが、名前付き関数は名前で自分自身を参照できます。これにより、彼らは自分自身を値として返すことができます。あるいは、通常の呼び出しの仕組みを通して、recurの先頭に戻ることができます。重要なのは、これが遅延セクションを生成する関数の正しい自己呼び出し戦略であることです。 in an earlier SO answerの理由を説明しました(「怠惰なシーケンスで再帰呼び出しをどうやって包み込むことができますか?」ブロック引用符の後の部分を参照してください)。

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

関連する問題