LoginSignup
3
0

More than 1 year has passed since last update.

【Clojure入門備忘録】ThreadingMacroの基本

Last updated at Posted at 2019-08-29

Threading Macroってなんだか難しそう....という先入観があった。
書いてみると難しくはないし、むしろ「Threading Macro使わないとかありえなくない?」となった。

ということで備忘録メモ。

そもそも何がやりたかったのか

階層構造になったMapの中の文字列を取り出して、1つの文字列を作りたかった。

このコレクション
dev> {:data {:operator "AND"
             :values [{:value1 "hoge"
                       :value2 "fuga"}
                      {:value1 "HOGE"
                       :value2 "FUGA"}]}}

こうしたい
"hoge,fuga AND HOGE,FUGA"

どうやってやるか

Threading Macroを使わない場合

dev> (defn func [{:keys [data]}]
       (clojure.string/join
        (str " " (:operator data) " ")
        (map #(str (:value1 %) "," (:value2 %)) (:values data))))
#'dev/func
dev> (func {:data {:operator "AND"
                   :values [{:value1 "hoge"
                             :value2 "fuga"}
                            {:value1 "HOGE"
                             :value2 "FUGA"}]}})
"hoge,fuga AND HOGE,FUGA"

書きにくい、読みにくい、かっこ辛い。

Threading Macroを使う場合

dev> (defn func [{:keys [data]}]
       (->> data
            :values 
            (map #(str (:value1 %) "," (:value2 %)))
            (clojure.string/join (str " " (:operator data) " "))))
#'dev/func
dev> (func {:data {:operator "AND"
                   :values [{:value1 "hoge"
                             :value2 "fuga"}
                            {:value1 "HOGE"
                             :value2 "FUGA"}]}})
"hoge,fuga AND HOGE,FUGA"

やりたいことを最下層から順番に書いただけ:clap:
->>は、thread-last macroというらしい。

対して、->thread-first macroという。(何が出来るのかはもう名前から察せる。)
cf. https://clojure.org/guides/threading_macros

ちなみにこのマクロを展開すると...

こうなる(当たり前だけど)
dev> (macroexpand '(->> data
                        :values 
                        (map 
                         #(str (:value1 %) "," (:value2 %)))
                        (clojure.string/join (str " " (:operator data) " "))))
(clojure.string/join
 (str " " (:operator data) " ")
 (map
  (fn* [p1__81698#] (str (:value1 p1__81698#) "," (:value2 p1__81698#)))
  (:values data)))

最後に

ちなみに、Threading Macroの代表的なものとして他にsome->, some->>,cond->あたりがある。
この辺はまた今度。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0