我是函数式编程和方案语言的初学者。
我找到了建立列表总和的方法:
(define (sum lst)
(if (empty? lst)
0
(+ (car lst) (sum (cdr lst)))))
(sum (list 1 2 3))
我的问题是:有没有办法建立一个列表的总和而没有像sum这样的额外函数,只需使用" +"功能如下:
(+ 1 2 3)
答案 0 :(得分:5)
您可以apply
函数的参数列表。所以在这种情况下你可以:
> (apply + (list 1 2 3))
6
答案 1 :(得分:2)
MIT / Gnu-Scheme的引用说,+
需要任意数量的参数。
我确信,这个标准。
一般来说:
(define (foo . args) ....)
的使用方式与(foo)
或(foo x)
或(foo x y)
,(foo x y z)
,....类似。在foo
内,参数将为'()
,(x)
,(x y)
或(x y z)
。
参见SICP的练习2.20或MIT / Scheme Reference 9.2 chap 2.1
这意味着:
对于算术程序+
,*
,-
和/
,您的过程不是必需的,因为它们是针对任意数量的参数定义的,包括零和一。
对于其他一些内置程序也是如此。
对于您自己的程序,您可以使用 dotted-tail 表示法。
您可以从GNU-Pages下载MIT / Scheme Reference。我认为它有助于Scheme的所有实现,因为标准的扩展是 描述。大多数部件都易于阅读。
答案 2 :(得分:1)
Common Lisp程序员应该关注 [http://www.gigamonkeys.com/book/functions.html]
在这里,您必须使用& rest而不是>。< (defun +(& rest numbers)...)
两种lisp方言都知道默认,可选和休息参数。