【问题标题】:How do I pass a list as a list of arguments in racket?如何将列表作为球拍中的参数列表传递?
【发布时间】:2011-10-24 11:54:49
【问题描述】:

我有这样的声明:

 ((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

【问题讨论】:

    标签: list parameters scheme racket


    【解决方案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)
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2013-11-10
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多