Syntax 在Scheme中获取任意数量参数的lambda表达式的正确语法

Syntax 在Scheme中获取任意数量参数的lambda表达式的正确语法,syntax,scheme,racket,Syntax,Scheme,Racket,在Scheme中,可以定义以下过程: (define (proc . vars) (display (length vars))) 这将允许您向proc发送任意数量的参数。但当我尝试这样做时: (define proc (lambda (. vars) (display (length vars)))) 我得到以下错误: 改为:非法使用“.” 对于获得任意数量参数的lambda表达式,我似乎找不到正确的语法。想法 (我正在使用DrScheme,版本209,语言

在Scheme中,可以定义以下过程:

(define (proc . vars)
        (display (length vars)))
这将允许您向proc发送任意数量的参数。但当我尝试这样做时:

(define proc (lambda (. vars)
        (display (length vars))))
我得到以下错误:

改为:非法使用“.”

对于获得任意数量参数的lambda表达式,我似乎找不到正确的语法。想法

(我正在使用DrScheme,版本209,语言设置为PLT(图形))


谢谢

lambda的第一个参数是参数列表:

(define proc (lambda vars
    (display (length vars))))

(proc 1 2 4) ; 3
(proc) ; 0
(define proc (lambda vars
    (display (length vars))))

您应该省略lambda参数列表上的括号,以表示可变数量的参数:

(define proc (lambda vars
    (display (length vars))))

(proc 1 2 4) ; 3
(proc) ; 0
(define proc (lambda vars
    (display (length vars))))

理解
(lambda args…
语法(其他海报已经发布了)的关键洞察是一个单独的非列表项(在本例中,
args
)是一个退化的不正确列表。例如:

(define a '(arg1 arg2 . rest))
a                   ; => (arg1 arg2 . rest) (improper list of length 2)
(cdr a)             ; => (arg2 . rest)      (improper list of length 1)
(cdr (cdr a))       ; => rest               (improper list of length 0)

只是想澄清一下:退化列表
(a1a2.args)
如果没有a1和a2,将只是
args
。退化列表是指缺少结尾对且带有nil的列表。@Tim:对于缺少
'()
结尾的列表,正确的术语是不正确的列表。退化的不恰当列表是一个看起来不再像列表的列表,甚至不是一个不恰当的列表。我不知道不恰当和退化之间的区别。谢谢。Lambda是一种特殊的形式,把Lambda形式中的第二件事称为“第一个参数”是错误的。对不起,这里是佩丹蒂船长。@John:你会怎么称呼它?我可能会称它为“lambda表单的第二个元素”。这个词的问题是“参数”与函数调用有着千丝万缕的联系。与你的问题无关,我强烈建议你升级到最新版本的DrScheme,现在称为DrRacket。你可以在这里下载:@SamTH我使用的DrScheme版本是由我的大学指定的,但无论如何,谢谢你-我可能会在空闲时间读完SICP,然后改用这个版本。。。