22

Clojureを学ぶ私は以下のようなコードに出くわしました:

=> (defrecord Person [name, age])
user.Person
=> (->Person "john" 40)
#user.Person{:name "john", :age 40}
=> (Person. "tom" 30)
#user.Person{:name "tom", :age 30}

問題は、 ->Personの先頭の矢印 (つまり、-> ) は何を意味するのかということです。それはリーダーマクロですか?clojuredoc のリーダー セクションにその説明はありません。さらに、 ->PersonとPersonの違いは何ですか。?

4

2 に答える 2

26

構文上の意味はありません。シンボル名の一部にすぎません。Lispsでは、矢印->(または単に'>')は、あるタイプから別のタイプへの変換またはキャストを意味するためによく使用されます。のマクロ展開ではdefrecord

(macroexpand '(defrecord Person [name age]))

コンストラクター ->Personを呼び出す関数として定義されていることがわかります。(関数)は、(Javaコンストラクターへの直接呼び出し)よりも使用する方が便利な場合があります。これは、引数として他の関数に渡したり、変数にキャプチャして使用したりできるためです。Person->PersonPerson.

(let [f ->Person]
  (f "Bob" 65))

それを以下と比較してください:

(let [f Person.]
  (f "Bob" 65))

これは構文的に無効です。

于 2012-08-21T03:58:49.393 に答える
3

明らかに特定の例ではありませんが、一般的なコンテキストでは、この演算子->スレッド演算子と呼ばれ、スラッシュ演算子の 1 つと見なされます。従兄弟である->>演算子と共に、これらの演算子は、コードをより明確に表示する必要がある場合、特に関数の出力をパラメーターとして別の関数に渡す場合に非常に役立ちます。どちらの演算子もマクロです。両方のオペレーターに関する 別のSO 投稿を次に示します。

を使用する理由はまだありませんが、中間値を計算し、それらすべてを 1 つの関数呼び出しに入れるために必要なコードを理解する->必要がありました。->>

ここに別の説明があります。

于 2012-08-21T22:08:12.800 に答える