我正在写一本关于clojure的书,然后遇到了一个带有" - >>"的绊脚石.作者提供了一个comp将camelCased关键字转换为具有更惯用法的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)
三个问题:缺少括号,缺少>名称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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |