Как передать список в виде списка аргументов в 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)