Function scheme lambda函数中的默认参数?

Function scheme lambda函数中的默认参数?,function,lambda,arguments,scheme,chicken-scheme,Function,Lambda,Arguments,Scheme,Chicken Scheme,我最近开始使用ChickenScheme,现在我想声明一个带有默认参数(如果没有指定)的函数。 我在Racket网站上找到了这个例子,我知道Racket和ChickenScheme是不同的,但我认为这些基本的东西是一样的 (define greet (lambda (given [surname "Smith"]) (string-append "Hello, " given " " surname))) 这是来自ChickenScheme解释器的错误: Error: during

我最近开始使用ChickenScheme,现在我想声明一个带有默认参数(如果没有指定)的函数。 我在Racket网站上找到了这个例子,我知道Racket和ChickenScheme是不同的,但我认为这些基本的东西是一样的

(define greet
  (lambda (given [surname "Smith"])
    (string-append "Hello, " given " " surname)))
这是来自ChickenScheme解释器的错误:

Error: during expansion of (lambda ...) - in `lambda' - lambda-list expected: (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))

Call history:

<syntax>      (define greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)))
<syntax>      (##core#set! greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)))
<syntax>      (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))    <--
错误:在扩展(lambda…)-在'lambda'中-应为lambda列表:(lambda(给定(姓氏“Smith”))(字符串附加“Hello”,给定“姓氏”)
通话记录:
(定义问候语(lambda(给定(姓氏“Smith”))(字符串附加“Hello”,给定“姓氏”))
(##core#set!greet(lambda(给定(姓氏“Smith”))(字符串附加“Hello”,给定“姓氏”))
(lambda(给定(姓氏“Smith”)(字符串附加“Hello”,给定“姓氏”)in-Racket的语法实际上是非标准的,所以不要期望其他解释器实现它。在Scheme中,标准特性是RxRS Scheme报告中定义的特性,是最新的特性。但不要害怕-在鸡肉计划中,您可以使用:

[语法](可选参数默认值)

对于采用单个可选参数的过程,请使用此表单。如果ARGS为空,则计算并返回默认值,否则返回列表ARGS的第一个元素。如果ARGS包含多个值,则为错误

像这样使用它:

(define (greet given . surname)
  (string-append "Hello, " given " " (optional surname "Smith")))

在普通方案中,您可以使用获取附加参数的列表,然后检查此列表以查看是否提供了附加参数:

(define greet
   (lambda (given . rest)
     (let ((surname (if (pair? rest) (car rest) "Smith")))
       (string-append "Hello, " given " " surname))))
因为这不是很方便,不同的方案系统为此提供了不同的选择。在CHICKEN中,我们支持,因此您可以这样做:

 (define greet
   (lambda (given #!optional (surname "Smith"))
     (string-append "Hello, " given " " surname)))
从RnRS中没有指定的意义上说,它不是“标准”,但它实际上与兼容,这对我来说已经足够标准了,而且在任何情况下都比Guile的可选参数样式(部分基于DSSL的可选参数语法,如Sjaman的回答中所述)更标准。