“ - >>” 中宏和迭代函数应用程序

时间:2013-08-01 13:40:38

标签: clojure

我正在阅读一本关于clojure的书,然后遇到了&#34; - &gt;&gt;&#34;的绊脚石。作者提供了comp的示例,该camelCasedcamel-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}}

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])))