2011-08-10 16 views
11

Mam oświadczenie takiego:Jak przekazać listę jako listę argumentów w grze?

((lambda (a b c) (+ a b c)) 1 2 3) ; Gives 6 

I chciałbym, aby móc przekazać ją również listę jako tak:

((lambda (a b c) (+ a b c)) (list 1 2 3)) 

... chyba to nie działa, ponieważ cała lista jest przekazywana jako "a". Czy istnieje sposób na rozbicie listy na argumenty?

To, czego szukam, to coś podobnego do znaku * w Pythonie. Dla tych z Was, zaznajomiony ze składnią:

def sumthree(a, b, c): 
    print a + b + c 

sumthree(1, 2, 3) # Prints 6 
sumthree(*(1, 2, 3)) # Also prints 6 

Odpowiedz

20

Takie działanie nazywa apply.

(apply + (list 1 2 3)) ; => 6 

"rozwija" ostatni argument; wszelkie poprzednie argumenty są przekazywane jako takie. To są wszystkie takie same:

(apply + 1 2 3 (list 4 5 6)) 
(apply + (list 1 2 3 4 5 6)) 
(+ 1 2 3 4 5 6) 
8

zwrócić uwagę na następującą definicją

(define (a . b) (apply + b)) 
(a 1) 
(a 1 2) 
(a 1 2 3) 

'' daje możliwość przekazania dowolnej liczby argumentów do funkcji. Możesz nadal mieć wymagane argumenty:

(define (f x . xs) (apply x xs)) ;; x is required 
(f + 1 2 3) ;; x is +, xs is (1 2 3) 
+0

To jest właściwie pierwotny powód, dla którego szukałem funkcji stosowania. Całkiem fajne rzeczy. – peskal

+0

To jest takie fajne. – setholopolus

+0

Dokumentacja wyjaśniająca użycie tej składni: https://docs.racket-lang.org/guide/define.html – setholopolus

Powiązane problemy