2012-05-29 40 views
9

在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代碼?

回答

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

或者只(以F 1 2 3 V) – Alex

+0

(申請(concat [1 2 3] v))很好,我可以連接其他的:(應用f(concat [1 2 3] v [7 8 9])) –

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的例子。

+0

來確定d元素,更好,(seq?[1 2 3])=> false –

3

只是爲了完整。

假設你有一個函數,向量[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)) 

通過這種方式,我們可以從傳遞到函數fd1 d2 d3矢量前3項。調用上面的函數會導致以下的輸出:

=> (f 1 2 3 [6 7 8 9]) 
a: 1 
b: 2 
c: 3 
d1: 6 
d2: 7 
d3: 8 

注意的是,即使載體包含4個項目,我們只取前3

相關問題