1

我正在尝试创建一个遍历每个元素并应用操作的映射函数。它就像一个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]

这个想法适用于任何对单个元素而不是顺序操作的函数。

4

2 回答 2

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))
于 2012-12-13T01:00:15.233 回答
0

请注意,您的第一行都不起作用,因为“if”条件只是检查第一个参数是否是顺序的,然后调用 op 将所有参数。

我建议使用http://richhickey.github.com/clojure/clojure.walk-api.html或查看它的代码;)

于 2012-12-13T00:19:14.993 回答