我正在搜索,但没有找到我问题的答案。
我正在阅读Clojure For The Brave and True,发现了map over map值的实现。
(reduce (fn [new-map [key val]]
(assoc new-map key (inc val)))
{}
{:max 30 :min 10})
工作正常,除了在REPL和file中抛出错误:
. lang。异常:无法解析此上下文中的symbol: new-map
在函数内部执行时:
(defn map-map [fn hash]
(reduce (fn [new-map [key val]]
(assoc new-map key (inc val)))
{}
hash))
我自己的实现(在阅读了第3章之后)工作得很好:
(defn map-map [fn hash]
(into {} (map #(conj [(first %)] (fn (second %))) hash)))
问题是我用一个参数遮蔽了fn
。new-map不再是匿名函数的参数,Clojure试图将其作为传递给函数fn
的vector中的值来求值。
(defn map-map [func hash]
(reduce (fn [new-map [key val]]
(assoc new-map key (func val)))
{}
hash))
愚蠢的错误,我添加这个答案只是以防有人会有同样的错误,我已经花时间创建了一个问题。
这是第一步,因为你可以看到在原始代码中有inc
,我还没有用fn替换,因为即使在REPL中编译器错误。
此外,问题是,我的map-map
的第一个实现没有使用fn
宏,所以我可以使用它作为一个函数。