fc2ブログ

t100のプログラミング脱出作戦

自分のプログラミング脳をプログラムにして、いつかプログラミングから脱出してやるぞっ!とか夢見ながら、日々プログラム作っていく 百野 貴博 の日記です!今は、屋号『百蔵。』として、Silverlight・WPFを追跡中です! (2007/09/30)
Clojureの"->"マクロ(右矢印みたいなやつ)
Clojureのサンプルコードを見ていたら、時々 (-> xxx yyy) みたいなコードに出会うことがあります。

これ、、、なんですのん。ヽ(;´д`)ノ


プログラミング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
スポンサーサイト



テーマ: プログラミング - ジャンル: コンピュータ

leiningen のプラグインを作る。
Clojureのビルドツール Leiningen (ライニンジェン?)のプラグインの作り方をまとめてみました。(`・ω・´)9m

Leiningen は、Clojureで書かれたビルドツールでMavenのようなものです。
#といいつつ、自分はMavenを実務でちゃんと使ったことないですがっ・・・(・∀・;)


プラグインは、Leiningen にタスクを追加する仕組みです。
Leiningenのタスクは、leiningen.$TASK という名前空間に$TASKという名前で関数を定義するという命名ルールになっています。
この命名規則に従って関数を作成すれば、あとはクラスパスに追加するだけでLeiningenで使えるようになります。
簡単ですね!


では、さっそくmyplugin という名前で簡単なプラグインを作ってみましょう!(*´д`*)

てってけてけてけてってってーん。
てってけてけてけてってってーん。(三分クッキングのテーマで)

⇒続きを読む ヽ(´ー`)ノ

テーマ: プログラミング - ジャンル: コンピュータ