4

検討

(defn f ^{:foo "bar"} [x] (* x x))

(defn g #^{:foo "bar"} [x] (* x x))

コンパイルと実行の両方。

私は2つの質問があります:最初に、なぜだけを実行(meta f)して(meta g)生成するのnilですか?私は彼らが生産することを期待していたでしょう{:foo "bar"}; さて、私はメタデータについて完全に昼食をとり、そこにある種のゴミを定義しましたか?

次に、メタデータの2つのシンタシスの違いは何ですか?2つ目は、拡張データ表記であるednと関係のある「タグ付きリテラル」のように見えますが、コンテキストや例がないと、完全に理解することはできません。

4

1 に答える 1

8

メタ#^データ リーダー マクロは、clojure 1.2 で置き換えられました。 ^現在、両者に違いはありませんが、古い形式は非推奨であり、^排他的に使用する必要があります。

メタデータ リテラルは、それが添付されるアイテムの前に来る必要があります。

(defn ^{:foo "bar"} f [x] (* x x))

留意すべきもう 1 つのことは、上記の定義のメタデータは関数に関連付けられているのvarではなく、関数を参照する に関連付けられているということです。次の方法でのメタデータを取得できますf var

(meta (var f))

または、varリーダー マクロを使用します。

(meta #'f)
于 2013-03-24T02:12:06.547 に答える