これ、、、なんですのん。ヽ(;´д`)ノ
プログラミングClojure本にも書いてないし、グーグル先生に聞こうにも記号だからうまく検索できな、、、
と思ったら、「Clojure arrow」 のキーワードで遂に解説ページを発見!(・∀・)わーい
Understanding the Clojure -> macro
どうも、関数を連続で呼び出す為のマクロみたいです。
上記ページをかいつまむと、こんな感じです。
例えば、こんな式があったとします。
(-> (Math/sqrt 25) int list)
これは、次のように解釈されます。
1.(Math/sqrt 25) が実行されます。 25 の平方根で、5.0 が戻り値です。(`・ω・´)9m
2.int 関数に5.0が渡されます。結果は 5 (整数値)になりますね。
3.list 関数に、5 が渡されます。 5を持ったリスト (5) になります。
同じ内容を、いつものS式に書きなおすとこうなります。
(list (int (Math/sqrt 25)))
おおっ。なんか分かってしまったでしょうか?
この、-> マクロは、"thread" と呼ばれるそうです。(Java.lang.Thread とは別の意味です)
動作としては、中に含まれるフォームを順に実行し、結果を次の一番外側のS式の2番目の引数として渡します。
#たいていの場合、S式の一番目は関数なので、”2番目の引数”とは関数の第一引数と読み替えてOKだと思います。
おお。めっちゃ便利やん。めっちゃ読みやすいやん。
また、このマクロを使った式を書く場合に
Clojureプログラマ達(Clojurians?)は、引数が渡される場所を明示するためにカンマを書くことがあるようです。
例えば、こんな感じに。
(-> (/ 144 12) (/ ,,, 2 3) str keyword list)
=> (:2)
(-> (/ 144 12) (* ,,, 4 (/ 2 3)) str keyword (list ,,, :33))
=> (:32 :33)
↑ 2番目の例で、(/ 144 12) の結果が、次の (* ,,, 4 (/ 2 3)) の一番外側の * の引数になっています。 内側にある / の引数にはなっていないです。
「一番外側のS式の2番目の引数」とは、こういう意味なんですね。
Clojureでは、カンマは空白とみなされます。
ですので、上記のカンマも処理としての意味は無く、読みやすさのために記号として書いているだけです。
#カンマを書くことで、その場所に代入するよう制御できるという意味ではないです。
また、記述するカンマの数も特に決まりは無いようで、好みの問題ということでした。(元のブログによると)
これは、読みやすいコードの為の強力な武器になりそうですね!!
それではまた!!(*゚∀゚)=3