Как передать список в виде списка аргументов в racket?
У меня есть инструкция вроде этого:
((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
Ответы
Ответ 1
Эта операция называется 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)
Ответ 2
Обратите внимание на следующее определение
(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)