Macros 我是在重新发明(方形)轮子吗?

Macros 我是在重新发明(方形)轮子吗?,macros,map,clojure,Macros,Map,Clojure,我们应该知道,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]] [[

我们应该知道,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”:

很明显,它就像一个符咒:

(umap vector [[0 1] [2 1]])        ; (4)
;=> ([0 2] [1 1])
所以我的问题是:我是在重新发明轮子吗? 有没有其他方法可以做到与(4)相同

再见,先谢谢你


Alfredo

应用
解压参数列表末尾序列中的所有元素

user> (apply map vector [[0 1] [2 1]])
([0 2] [1 1])

您的
umap
工作起来很有魅力,这一点并不明显。事实上,只有在编译时将参数向量作为一个文本时,它才会起作用-这正是您可以将多个参数传递给
map
的时间

user> (umap vector [[1 2] [1 2]])
([1 1] [2 2])
user> (let [args [[1 2] [1 2]]]
        (umap vector args))
java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol
[Thrown class java.lang.RuntimeException]
宏只能访问符号
args
,因为它在编译时运行,不能为了使用map而拼接它。正确答案是使用,它将其最后一个参数视为一个序列,并将其拼接为给定函数的一系列附加参数:

user> (let [args [[1 2] [1 2]]]
        (apply map vector args))
([1 1] [2 2])

我是错过了什么,还是满足了你的需要?

谢谢,我确信我是在重新发明轮子:)谢谢,阿马洛伊,你的答案总是有用的!你一定错过了什么,但我不知道是什么<代码>地图猫不会让他更接近解决问题。啊,好吧。我想我知道我现在错过了什么。
user> (let [args [[1 2] [1 2]]]
        (apply map vector args))
([1 1] [2 2])