如何将列表作为球拍中的参数列表传递?
Posted
技术标签:
【中文标题】如何将列表作为球拍中的参数列表传递?【英文标题】: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
【问题讨论】:
【参考方案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)
【讨论】:
这实际上是我寻找apply函数的最初原因。非常整洁的东西。 解释此语法使用的文档:docs.racket-lang.org/guide/define.html以上是关于如何将列表作为球拍中的参数列表传递?的主要内容,如果未能解决你的问题,请参考以下文章
将列表/数组作为参数/返回类型传递并返回给 Redshift 中的 UDF
如何将列表传递给pyspark中的selectExpr方法?