在Python中,您可以将列表或元组传递给函数,并让函数解包参数。我怎么能在Clojure中做到这一点?以下是一些示例Python代码:
def f (a, b, c, *d):
print "a: ", a
print "b: ", b
print "c: ", c
print "d: ", d
f (1, 2, 3, 4, 5, 6)
print
v = (4, 5, 6)
f(1, 2, 3, *v)
结果:
a: 1
b: 2
c: 3
d: (4, 5, 6)
a: 1
b: 2
c: 3
d: (4, 5, 6)
在我的clojure代码中:
(defn f [a b c & d]
(println "a: " a)
(println "b: " b)
(println "c: " c)
(println "d: " d))
(f 1 2 3 4 5 6)
(println)
(def v [4 5 6])
(f 1 2 3 v)
结果:
a: 1
b: 2
c: 3
d: (4 5 6)
a: 1
b: 2
c: 3
d: ([4 5 6])
d只有一个元素,我怎么能把结果作为python代码?
答案 0 :(得分:11)
Clojure不会从具有语言功能的向量中解压缩参数,就像Python那样。
最接近解包的是函数apply。
在这种特殊情况下:
(def v [4 5 6])
(apply f (concat [1 2 3] v))
打印:
a: 1
b: 2
c: 3
d: (4 5 6)
答案 1 :(得分:4)
只是为了完整。
假设您有一个以向量[d1 d2 d3]
作为参数的函数
(defn f
[a b c [d1 d2 d3]]
(println "a: " a)
(println "b: " b)
(println "c: " c)
(println "d1: " d1)
(println "d2: " d2)
(println "d3: " d3))
这样我们就可以将传递给函数f
的向量中的前3项作为d1 d2 d3
。调用上述函数会产生以下输出:
=> (f 1 2 3 [6 7 8 9])
a: 1
b: 2
c: 3
d1: 6
d2: 7
d3: 8
请注意,即使向量包含4个项目,我们也只选择前3个。
答案 2 :(得分:0)
对于Clojure中的任何参数,您可以使用顺序确定参数是标量值还是序列?在下面的伪代码中,
(if (sequential? v)
(do-something-because-it's-a-sequence v)
(do-something-different-because-it's-not-a-sequence v))
因此,在Clojure中,您可以通过确定是否有序列来完成与Python示例相同的任务。