我是一名函数式编程和Scheme语言的初学者。
我找到了一个构建列表总和的方法:
(define (sum lst)
(if (empty? lst)
0
(+ (car lst) (sum (cdr lst)))))
(sum (list 1 2 3))
我的问题是:是否有一种方法可以使用“+”函数来构建列表的总和,而不需要像sum这样的额外函数,就像这样:
(+ 1 2 3)
> (apply + (list 1 2 3))
6
+
可以接受任意数量的参数。我确信这是标准规范。(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 参考手册 9.2 章节 2.1。
这意味着:
对于算术运算符+
, *
, -
和 /
,您不需要自己定义过程,因为它们已经被定义为可以接受任意数量的参数,包括零个和一个。
对于一些其他内置的过程也是如此。
对于您自己的过程,您可以使用 dotted-tail 符号表示参数列表。
您可以从 GNU-Pages 下载 MIT/Scheme 参考手册。我认为它有助于所有 Scheme 的实现,因为它描述了标准的扩展部分,大多数内容易于理解。
Common Lisp程序员应该查看[http://www.gigamonkeys.com/book/functions.html]。
在这里,您必须使用&rest而不是>.<。 (defun + (&rest numbers) ...)
这两个Lisp方言都知道默认、可选和剩余参数。