Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?