我正在阅读一本关于clojure的书,然后遇到了" - >>"的绊脚石。作者提供了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])")))
方法的clojure地图。这是使用comp的代码:
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)))
来线程映射索引(或任何迭代函数)。这是错的:
{{1}}
答案 0 :(得分:6)
三个问题:错过括号,错过>
名称中的camel->keyword
,而不是使用初始表达式->>
“播种”s
宏。< / p>
(defn camel-pairs->map [s]
(->> s
(map-indexed
(fn [i x]
(if (odd? i)
x
(camel->keyword x))))
(apply hash-map)))
这真的比说清楚吗?
(defn camel-pairs->map [s]
(into {}
(for [[k v] (partition 2 s)]
[(camel->keyword k) v])))