" - >>"宏和迭代函数应用程序

Cle*_*v3r 3 clojure

我正在写一本关于clojure的书,然后遇到了一个带有" - >>"的绊脚石.作者提供了一个compcamelCased关键字转换为具有更惯用法的clojure地图的示例camel-cased.这是使用comp的代码:

(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])")))
Run Code Online (Sandbox Code Playgroud)

这很有意义,但我并不喜欢partial在整个地方使用来处理可变数量的参数.相反,这里提供了另一种选择:

(defn camel->keyword
  [s]
  (->> (str/split s #"(?<=[a-z])(?=[A-Z])")
    (map str/lower-case)
    (interpose \-)
    str/join
    keyword))
Run Code Online (Sandbox Code Playgroud)

这种语法更具可读性,并模仿我思考解决问题的方式(从前到后,而不是从前到后).扩展comp以完成上述目标......

(def camel-pairs->map (comp (partial apply hash-map)
                            (partial map-indexed (fn [i x]
                                                   (if (odd? i)
                                                     x
                                                     (camel->keyword x))))))
Run Code Online (Sandbox Code Playgroud)

什么是等效使用->>?我不确定如何使用地图索引(或任何迭代函数)->>.这是错的:

(defn camel-pairs->map 
  [s]
  (->> (map-indexed (fn [i x]
         (if (odd? i)
           x
           (camel-keyword x))) 
       (apply hash-map)))
Run Code Online (Sandbox Code Playgroud)

A. *_*ebb 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)))
Run Code Online (Sandbox Code Playgroud)

这真的比说清楚吗?

(defn camel-pairs->map [s] 
  (into {} 
    (for [[k v] (partition 2 s)] 
      [(camel->keyword k) v])))
Run Code Online (Sandbox Code Playgroud)