我最近开始使用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)) <--
答案 0 :(得分:5)
在plain Scheme中,您可以使用dotted tail notation获取其他参数的列表,然后检查此列表以查看是否提供了额外参数:
(define greet
(lambda (given . rest)
(let ((surname (if (pair? rest) (car rest) "Smith")))
(string-append "Hello, " given " " surname))))
因为这不是很方便,不同的Scheme系统为此提供了不同的替代方案。在CHICKEN中,我们支持DSSSL annotations,因此您可以执行此操作:
(define greet
(lambda (given #!optional (surname "Smith"))
(string-append "Hello, " given " " surname)))
答案 1 :(得分:3)
Racket中optional arguments的语法实际上是非标准的,因此不要指望其他解释器实现它。在Scheme中,标准功能是RxRS方案报告中定义的功能,R7RS是最新的功能。但不要害怕 - 在Chicken Scheme中,你可以使用optional
:
[syntax] (optional ARGS DEFAULT)
将此表单用于采用单个可选参数的过程。如果ARGS是空列表,则评估并返回DEFAULT,否则列表ARGS的第一个元素。如果ARGS包含多个值,则会出错。
像这样使用:
(define (greet given . surname)
(string-append "Hello, " given " " (optional surname "Smith")))