見出し画像

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系の言語で、カッコから始まるという独特の書き方で、最初は面食らいますが、流れるようなコーディングを可能にしてくれる機能がたくさん盛り込まれていて、書いていて楽しいです。





この記事が気に入ったらサポートをしてみませんか?