I have a statement like this:
((lambda (a b c) (+ a b c)) 1 2 3) ; Gives 6
And I would like to be able to also pass it a list as so:
((lambda (a b c) (+ a b c)) (list 1 2 3))
...except this doesn't work because the entire list is passed as 'a.' Is there is a way to explode the list into arguments?
What I'm looking for is something similar to the * character in Python. For those of you unfamiliar with the syntax:
def sumthree(a, b, c):
print a + b + c
sumthree(1, 2, 3) # Prints 6
sumthree(*(1, 2, 3)) # Also prints 6
That operation is called apply
.
(apply + (list 1 2 3)) ; => 6
apply
"expands" the last argument; any previous arguments are passed as is. So these are all the same:
(apply + 1 2 3 (list 4 5 6))
(apply + (list 1 2 3 4 5 6))
(+ 1 2 3 4 5 6)
Pay attention to the following definition
(define (a . b) (apply + b))
(a 1)
(a 1 2)
(a 1 2 3)
'.' gives you ability to pass any number of arguments to a function. You can still have required arguments
(define (f x . xs) (apply x xs)) ;; x is required
(f + 1 2 3) ;; x is +, xs is (1 2 3)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With