Syntax 在Scheme中获取任意数量参数的lambda表达式的正确语法
在Scheme中,可以定义以下过程: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,语言
(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,然后改用这个版本。。。