Как передать список в виде списка аргументов в рэкет? - PullRequest
12 голосов
/ 11 августа 2011

У меня есть такое утверждение:

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

И я хотел бы также передать ему список следующим образом:

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

... за исключением того, что это не работает, потому что весь список передается как «a». Есть ли способ разбить список на аргументы?

Я ищу что-то похожее на символ * в Python. Для тех из вас, кто не знаком с синтаксисом:

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

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

Ответы [ 2 ]

24 голосов
/ 11 августа 2011

Эта операция называется apply.

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

apply «расширяет» последний аргумент; все предыдущие аргументы передаются как есть. Так что это все одинаково:

(apply + 1 2 3 (list 4 5 6))
(apply + (list 1 2 3 4 5 6))
(+ 1 2 3 4 5 6)
8 голосов
/ 12 августа 2011

Обратите внимание на следующее определение

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

'.'дает вам возможность передать любое количество аргументов функции.Вы все еще можете иметь обязательные аргументы

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