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

Hil*_*ila 10 syntax scheme racket

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

(define (proc . vars)
        (display (length vars)))
Run Code Online (Sandbox Code Playgroud)

这将允许您发送任何数量的args到proc.但是当我尝试这样做时:

(define proc (lambda (. vars)
        (display (length vars))))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

读:非法使用"."

我似乎无法找到获取任意数量参数的lambda表达式的正确语法.想法?

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

谢谢!

Tim*_*Tim 15

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

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

(proc 1 2 4) ; 3
(proc) ; 0
Run Code Online (Sandbox Code Playgroud)


Chr*_*ung 6

理解(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)
Run Code Online (Sandbox Code Playgroud)

  • @Tim:缺少`'()`end的列表的正确术语是_improper list_._degenerate_不正确的列表是一个甚至看起来像列表的列表,甚至不是一个不合适的列表. (3认同)
  • 只是为了澄清:退化列表`(a1 a2.args)`,如果没有a1和a2,只需要`args`.退化列表是缺少nil的结束对的列表. (2认同)