3

我正在阅读一本关于clojure的书,并遇到了“->>”的绊脚石。作者提供了一个使用更惯用的方法comp将关键字转换为 clojure map 的示例。这是使用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])")))

这很有意义,但我真的不喜欢到处使用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)))
4

1 回答 1

6

三个问题:缺少括号,缺少>名称中的,以及没有用初始表达式camel->keyword“播种”您的宏。->>s

(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])))
于 2013-08-01T14:03:04.957 回答