2011-06-26 7 views
8

2人はClojureで同じことをしているようです。正式な構文は何ですか?^または:tagタグ付きのヒンティング戻り値?

(defn a ^int [] 4) 

(defn b ^{:tag int} [] 4) 

私はそれがより短いのでaだと思います。

+1

実際、intへの関数の型ヒントはもう動作しません。それは長くて倍増だ。また、ここに追加されたすべての組み合わせがあります:https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java#L97それは見た目に狂気ではありません。 – claj

+0

@claj神様、私はコードが何らかの形で生成されたことを願っています。さもなければ、私は貧しい汁がその仕事にこだわっていても、残念です。 – Carcigenicate

+0

おそらくhttps://github.com/clojure/math.combinatoricsとhttps://clojuredocs.org/clojured.pprint/cl-formatの組み合わせ – claj

答えて

8

タグ以外のメタデータを含める必要がある場合は、bのみを使用します。例えば、過渡コレクションを実装する場合、私はそれが同等と

(deftype Whatever [^:unsynchronized-mutable ^ITransientVector foo]) 

を書くことは完全に許容可能であることを

(deftype Whatever [^{:tag ITransientVector 
        :unsynchronized-mutable true} foo]) 

注意が必要しかし、私は個人的には、明示的なマップを好みます。

5

その 'a'は標準です。これまでClojureコードとClojureサイトのドキュメントで私が見てきた唯一のものです。タイプヒントの詳細については、hereを参照してください。

これが役に立ちます。

+3

スピードの違いがあると、私はかなり驚いています。それはより速く髪をコンパイルするかもしれませんが、それは同じに動作し、コンパイルは一度だけ起こります。これをテストするのに便利なベンチマークはありますか? – amalloy

+0

+1あなたの権利、もう一度試してみると時間がかかっていますが、両者は似ていますのでスピードは上がらないでしょう。それに応じて編集された投稿。 – adamjmarkham

+2

+1。また、(a)は実際には(b)の構文的な砂糖なので、実行時に同じ結果が得られます。 – mikera