2012-05-29 6 views
9

In Python, è possibile passare una lista o una tupla a una funzione e fare in modo che la funzione scompatta l'argomento. Come posso farlo in Clojure? Ecco qualche esempio di codice Python:Come destrutturare un vettore per utilizzarlo come argomento di funzione

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) 

risultato:

a: 1 
b: 2 
c: 3 
d: (4, 5, 6) 

a: 1 
b: 2 
c: 3 
d: (4, 5, 6) 

nel mio codice 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) 

risultato:

a: 1 
b: 2 
c: 3 
d: (4 5 6) 

a: 1 
b: 2 
c: 3 
d: ([4 5 6]) 

d hanno un elemento unico , come posso lasciare il risultato come codice Python?

risposta

11

Clojure non scompatta gli argomenti da un vettore con una funzionalità di linguaggio, come fa Python.

La cosa più vicina allo spacchettamento è la funzione apply.

In questo caso particolare:

(def v [4 5 6]) 
(apply f (concat [1 2 3] v)) 

Stampe:

a: 1 
b: 2 
c: 3 
d: (4 5 6) 
+1

O solo (f diffusa 2 3 v 1) – Alex

+0

(applicare f (concat [1 2 3] v)) è grande, posso concatenare gli altri: (applicare f (concat [1 2 3] v [7 8 9])) –

0

Per qualsiasi argomento a Clojure, è possibile determinare se l'argomento è un valore scalare o di una sequenza utilizzando sequenziale? Nella pseudo-codice qui sotto,

(if (sequential? v) 
    (do-something-because-it's-a-sequence v) 
    (do-something-different-because-it's-not-a-sequence v)) 

Così, in Clojure, è possibile eseguire la stessa operazione, come nel tuo esempio Python per determinare se si dispone di una sequenza o no.

+0

per determinare l'elemento d, usare sequenziale? è meglio, (seq? [1 2 3]) => false –

3

Solo per completezza.

Diciamo che avete una funzione che prende un vettore [d1 d2 d3] come argomento

(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)) 

In questo modo siamo in grado di muovere i primi 3 elementi dal vettore che viene passato alla funzione f come d1 d2 d3. Chiamando i risultati funzione sopra il seguente risultato:

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

noti che anche se il vettore contiene 4 articoli, solamente prendere la prima 3.

Problemi correlati