【发布时间】:2011-04-08 16:11:21
【问题描述】:
我们应该知道,Clojure 的map 可以应用于序列:
(map #(* %1 %1) [1 2 3]) ; (1)
..或不止一个,这样:
(map vector [0 1] [2 1]) ; (2)
;=> ([0 2] [1 1])
现在我想获得与 (2) 相同的结果,但我将参数存储在一个序列中。换句话说,以下内容不会给出预期的结果:
(map vector [[0 1] [2 1]]) ; (3)
;=> ([[0 1]] [[2 1]])
所以我写了这个简单的宏,其中 umap 代表“unsplice map”:
(defmacro umap [fun args-list]
"umap stands for unspliced map.
Let args-list be a list of args [a1 a2 ... an].
umap is the same of (map fun a1 a2 .. an)"
`(map ~fun ~@args-list))
显然它就像一个魅力:
(umap vector [[0 1] [2 1]]) ; (4)
;=> ([0 2] [1 1])
所以这是我的问题:我是在重新发明轮子吗? 是否有其他方法可以与(4)相同?
提前谢谢你,
阿尔弗雷多
【问题讨论】: