我正在尝试在“勇敢与真实的Clojure”一书的第4章结尾处理解“FWPD的吸血鬼数据分析程序”。这是代码:
(ns fwpd.core)
(def filename "suspects.csv")
(def vamp-keys [:name :glitter-index])
(defn str->int
[str]
(Integer. str))
(def conversions {:name identity
:glitter-index str->int})
(defn convert
[vamp-key value]
((get conversions vamp-key) value))
(defn parse
"Convert a CSV into rows of columns"
[string]
(map #(clojure.string/split % #",")
(clojure.string/split string #"\n")))
(defn mapify
"Return a seq of maps like {:name \"Edward Cullen\" :glitter-index 10}"
[rows]
(map (fn [unmapped-row]
(reduce (fn [row-map [vamp-key value]]
(assoc row-map vamp-key (convert vamp-key value)))
{}
(map vector vamp-keys unmapped-row)))
rows))
(defn glitter-filter
[minimum-glitter records]
(filter #(>= (:glitter-index %) minimum-glitter) records))
有人可以帮助转换和转换功能吗?
答案 0 :(得分:1)
conversions
是一个映射,因此包含键值对,称为映射条目。 get
是一个函数,当你拥有的只是一个键,当然还有地图时,它允许你获得相应的值。因此,convert
要完成其工作,vamp-key
必须是:name
或:glitter-index
(因为它们是地图上的唯一键)。假设它是:glitter-index
并返回str->int
。因此:
((get conversions vamp-key) value))
,变为:
(str->int value)
因此需要vamp-key
才能获得convert
值的正确函数。如果:glitter-index
和"10"
是传递给函数的参数,则会返回10
。