Clojure/ClojureScriptでのthreadingマクロで流れるようなコーディング
Clojure/ClojureScriptでは、データ処理を流れるようにコーディングできます。その一つ道具としてthredingマクロがあります。(Pythonのthreadingみたいにプログラムの処理単位を示すものではありません)。
この記事を書くにあたってthreadという単語の意味を今まで知らなかったので、調べてみると「糸」「筋道」とかの意味なんですね。知らなかった。
threadingマクロは、->か->>が基本になります。この他にも-as->、as->>、conf->などがあります。
超簡単な例ですが、
(->> 10 ;個数
(* 230) ;単価
(* 1.30) ;税 30%
(+ 30) ;サービス料
int
(str "合計:"))
;=> "合計:3020"
;一行で書くと
(->> 10 (* 230) (* 1.30) (+ 30) int (str "合計:"))
というように書きます。
こうやって、threadの単語の意味を知って、あらためてthreadingマクロをみると、糸通す針、筋道を示す矢印に見えますね。
これをスレッドマクロを使わずに書くと
(str "合計:"
(int
(+ 30
(* 1.30
(* 230 10)))))
;一行で書くと
(str "合計:" (int (+ 30 (* 1.30 (* 230 10)))))
になります。計算結果は同じですが、threadingマクロを使った方が入れ子状態が解消され、スッキリ計算過程が表されます。ちなみに、どちらのコードも括弧の数は同じです。
Clojureの設計者であるRich Hickyは「Effective Programs - 10 Years of Clojure」においてClojureのデザインの目的として(30分ごろ)、
・can we create effective, situated programs out of substantially simpler stuff?
・with low cognitive load from language
・make a Lisp I can user instead of Jave/C#
の3つを挙げていて、threadingマクロは最初の二つの目的を果たしていると思います。Clojureにはthreadingマクロ以外にも、この二つを実現するための機能がたくさん盛り込まれています。シンプルにコードを記述でき、コードの理解のために脳が酷使されません。
ClojureはLISP系の言語で、カッコから始まるという独特の書き方で、最初は面食らいますが、流れるようなコーディングを可能にしてくれる機能がたくさん盛り込まれていて、書いていて楽しいです。
この記事が気に入ったらサポートをしてみませんか?