我正在尝试创建一个遍历每个元素并应用操作的map函数。它就像map
函数一样,但深入人心。
该功能需要两个参数;一个函数和一个参数。
这是我到目前为止所做的:
(defn go-through
[op & args]
(if-not (sequential? (first args))
(apply op args)
(apply (partial map go-through op) args)))
我知道即使没有打电话,最后一行也行不通。但我不知道怎么回事。
建议?
也许我限制了这种功能的用途。
样品:
user=> (go-through + 1 2)
3
user=> (go-through + [1 2] [3 4])
IllegalArgumentException Don't know how to create ISeq from: clojure.core$_PLUS_ clojure.lang.RT.seqFrom (RT.java:494)
我期待[4 6]
这个想法适用于任何对单个元素进行操作的函数,而不是顺序元素。
答案 0 :(得分:2)
这可能是你的解决方案:
(defn go-through [op & args]
(if-not (sequential? (first args))
(apply op args)
(apply map op args)))
(go-through + 1 2 3)
-> 6
(go-through + [1 2] [3 4] [5 6])
-> (9 12)
版本2(修复原始示例)
(defn go-through [op & args]
(if-not (sequential? (first args))
(apply op args)
(apply map (partial go-through op) args)))
(go-through + [[1 2] [3 4]] [[5 6] [7 8]])
-> ((6 8) (10 12))
答案 1 :(得分:0)
请注意,您的第一行既不会起作用,因为“if”条件只是检查第一个参数是否是顺序,然后调用op将是所有参数。
我建议使用http://richhickey.github.com/clojure/clojure.walk-api.html或查看其代码;)