私は clojure に関する本を読んでいて、「->>」でつまずきました。著者は、より慣用的なアプローチでキーワードを clojure マップにcomp
変換するa の例を提供しています。comp を使用したコードは次のとおりです。camelCased
camel-cased
(require '[clojure.string :as str])
(def camel->keyword (comp keyword
str/join
(partial interpose \-)
(partial map str/lower-case)
#(str/split % #"(?<=[a-z])(?=[A-Z])")))
これは非常に理にかなっていますがpartial
、可変数の引数を処理するためにあらゆる場所で使用するのはあまり好きではありません。代わりに、代替手段を以下に示します。
(defn camel->keyword
[s]
(->> (str/split s #"(?<=[a-z])(?=[A-Z])")
(map str/lower-case)
(interpose \-)
str/join
keyword))
この構文ははるかに読みやすく、問題の解決について私が考える方法を模倣しています (後ろから前ではなく前から後ろ)。comp
前述の目標を達成するために を拡張しています...
(def camel-pairs->map (comp (partial apply hash-map)
(partial map-indexed (fn [i x]
(if (odd? i)
x
(camel->keyword x))))))
を使用して同等のものは何->>
ですか? を使用してマップインデックス (または任意の反復関数) をスレッド化する方法が正確にはわかりません->>
。これは間違っています:
(defn camel-pairs->map
[s]
(->> (map-indexed (fn [i x]
(if (odd? i)
x
(camel-keyword x)))
(apply hash-map)))