如何将列表作为参数列表传递给球拍?

pes*_*kal 13 parameters scheme list racket

我有这样的声明:

 ((lambda (a b c) (+ a b c)) 1 2 3) ; Gives 6
Run Code Online (Sandbox Code Playgroud)

我希望能够将列表传递给它:

((lambda (a b c) (+ a b c)) (list 1 2 3))
Run Code Online (Sandbox Code Playgroud)

...除了这不起作用,因为整个列表作为'a'传递.有没有办法将列表分解为参数?

我正在寻找的东西类似于Python中的*字符.对于那些不熟悉语法的人:

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

 sumthree(1, 2, 3) # Prints 6
 sumthree(*(1, 2, 3)) # Also prints 6
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 25

该操作被调用apply.

(apply + (list 1 2 3))   ; => 6
Run Code Online (Sandbox Code Playgroud)

apply"扩大"最后一个论点; 任何先前的参数都按原样传递.所以这些都是一样的:

(apply + 1 2 3 (list 4 5 6))
(apply + (list 1 2 3 4 5 6))
(+ 1 2 3 4 5 6)
Run Code Online (Sandbox Code Playgroud)


pau*_*aul 9

请注意以下定义

(define (a . b) (apply + b))
(a 1)
(a 1 2)
(a 1 2 3)
Run Code Online (Sandbox Code Playgroud)

'' 使您能够将任意数量的参数传递给函数.您仍然可以拥有必需的参数

(define (f x . xs) (apply x xs)) ;; x is required
(f + 1 2 3) ;; x is +, xs is (1 2 3)
Run Code Online (Sandbox Code Playgroud)

  • 解释此语法使用的文档:https://docs.racket-lang.org/guide/define.html (2认同)