scheme lambda函数中的默认参数?

And*_*eri 2 lambda scheme arguments function chicken-scheme

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

(define greet
  (lambda (given [surname "Smith"])
    (string-append "Hello, " given " " surname)))
Run Code Online (Sandbox Code Playgroud)

这是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))    <--
Run Code Online (Sandbox Code Playgroud)

sja*_*aan 5

在plain Scheme中,您可以使用点尾符号来获取其他参数的列表,然后检查此列表以查看是否提供了额外参数:

(define greet
   (lambda (given . rest)
     (let ((surname (if (pair? rest) (car rest) "Smith")))
       (string-append "Hello, " given " " surname))))
Run Code Online (Sandbox Code Playgroud)

因为这不是很方便,不同的Scheme系统为此提供了不同的替代方案.在CHICKEN中,我们支持DSSSL注释,因此您可以这样做:

 (define greet
   (lambda (given #!optional (surname "Smith"))
     (string-append "Hello, " given " " surname)))
Run Code Online (Sandbox Code Playgroud)