私はこのユースケースは、リッチのアイデアではなく私のものですが、おそらくそれは対象としています怖い:
言語自体がdefn
とdefmacro
含むdef
を包むdef
フォーム(と便利なマクロ、でこの機能を使用しています)、作成されているVarsを表すシンボルに付けられたメタデータがVars自身に転送されるためです。これは、コンパイラとさまざまなツールで使用できます。
defn
& Coordinatesはオプションで、Varsメタデータにマージされる属性マップ引数を取ることがあるので、ユーザーの視点から記号名のメタデータを使用する必要はありません。しかし、プレーンdef
は、そうではなく、内部ではdefn
がdef
フォームに展開され、メタデータはVar名自体にアタッチされたアトリビュートマップから取得されます。 (完全性のために、Varのメタデータマップを作成した後に別のステップで変更することは可能ですが、defn
では起こりません)
これはプログラマからは全く隠されていません。道。反対に、メタデータを「手で」シンボルに付けることは、多くの場合、属性マップを使用するよりも簡潔です(多分もっと慣用的なこともあります)。 Clojureは独自の標準ライブラリには、このスタイルを使用しています(と私はポストブートストラップを意味する) - 例えば、clojure.core
とclojure.string
の両方がバールを定義replace
の名前が、後者のみが戻り値の型(すなわちString
)でタグ付けされています
;;; clojure.core
(defn replace
...)
;;; clojure.string
(defn ^String replace
...)
^String
ここでは{:tag String}
に変換されます。これは、読み取り時にシンボルreplace
に付けられ、後でコンパイラによって(タイプヒントとして)使用されます。その他の用途としては、^:private
(1.2ではClojure 1.3,^{:private true}
)のプライベートとしてVarsをマークし、平文def
で作成したVarsにドキュメントストリングを添付します(1.2:1.3ではそれを行う唯一の方法は余分なdocstring引数を与えますが、まだ^{:doc "..."}
が使用されています)など
同様に、ClojureScriptでは、foo
の2つの関数だけをエクスポートすることができます(もちろん、別の名前空間に存在する)。その場合、あなたは他の中
(defn ^:export foo ...)
1つの名前空間に
と
(defn foo ...)
を言うと思います。 ^:export
が読み込み時に^{:export true}
に変換されると、これはシンボルfoo
のこのオカレンスのメタデータにマージされ、次にClojureScriptコンパイラによって読み込まれ、処理されます。
ユニークではないものはどうなりますか? –