Lambda 采用任意数量参数的过程的目的/用途?

Lambda 采用任意数量参数的过程的目的/用途?,lambda,scheme,Lambda,Scheme,在类(scheme)中,我们最近了解了允许函数接受任意数量参数的语法,例如 (define len (lambda args (length args))) >(len 1 2 3) 3 使用这种形式比简单地将参数作为单个列表传递有什么好处?您如何在程序中(而不是在命令行上)向这些函数传递参数?有没有一种方法可以使过程返回一系列未包装在列表中的值?是的,可以使用值过程返回多个值,并且可以使用应用将任意参数传递给过程。但您的课程可能尚未教授这些概念。:-) 假设您有以下两个“

在类(scheme)中,我们最近了解了允许函数接受任意数量参数的语法,例如

(define len
  (lambda args
    (length args)))

>(len 1 2 3)
3

使用这种形式比简单地将参数作为单个列表传递有什么好处?您如何在程序中(而不是在命令行上)向这些函数传递参数?有没有一种方法可以使过程返回一系列未包装在列表中的值?

是的,可以使用
过程返回多个值,并且可以使用
应用
将任意参数传递给过程。但您的课程可能尚未教授这些概念。:-)

假设您有以下两个“len”函数:

(define len1
  (lambda args (length args)))

(define len2
  (lambda (lst) (length lst)))
您可以将这些调用为:

> (len1 1 2 3)
3
> (len2 (list 1 2 3)
3
正如你所看到的,没有太大区别。在
len2
的情况下,您创建了列表;在
len1
的情况下,编译器创建了列表。可以说,编译器的效率可能会稍微高一点

假设您已经有了一个要计算长度的列表。对于这两种情况,您将使用:

> (define l '(1 2 3))
> (apply len1 l)
3
> (len2 l)
3
; note
> (len1 l)
1
apply
函数将列表作为其第二个参数,并将列表元素作为其第一个参数的参数“显示”(
len1

如果您不想返回列表,但确实想返回多个值,您可以使用
值作为

(define my-return-3-values-function
  (lambda (a b c)
    (values a b c)))
可变函数 一个非常有用的例子是

(define (list . elements) elements)
; or
(define list (lambda elements elements))
对于自然为n元函数的函数,变量函数也很方便。例如,如果您已经有一个二进制加法函数
add2
,您可以

(define + (lambda addends (foldl add2 0 addends)))
; or
(define (+ . addends) (foldl add2 0 addends))
除了称这些为

(+ 1 2 3)
;=> 6
当列表中已有参数时,也可以使用
apply

(apply + '(1 2 3))
;=> 6
这样做的一个优点是更容易编写使用不同参数约定的函数。我不知道这在Scheme中是否特别常见,但您可以使用它来获取关键字/命名参数。例如,不是定义

(define (subseq lst start end) ...)
如果您总是必须提供开始和结束参数,您可以这样做

(define (subseq lst . args) ...)
因此,
lst
始终是必需的,但是args可以或不能包含开始和结束参数。您可以使用它来实现默认值。例如:

(subseq lst 'start 3 'end 6) ; specify both expllicitly
(subseq lst 'end 6)          ; default value for start, e.g., 0
(subseq lst 'start 4)        ; default value of end, e.g., length of list
(subseq lst)                 ; default for both, copy the list
您必须编写代码来提取指定值或默认值,但这并不难

多值 至于返回多个值,您可以使用适当命名的
返回多个值:

(values 1 2 3)
;=> 1
;=> 2
;=> 3

但这实际上与接受任意数量参数的函数无关,因为这些参数与列表相关联,
值与列表无关。

一个非常有用的例子是
(define(list.elements)elements)
(也称为
(define list(lambda elements))
。变量函数对于自然n元函数也很方便。例如,如果您已经有一个二进制加法函数,您可以执行
(定义+(lambda加法(foldl add2 0加法)))