方案 lambda 函数中的默认参数



我最近开始使用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))    <--

在普通方案中,您可以使用虚线尾表示法获取其他参数的列表,然后检查此列表以查看是否提供了额外的参数:

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

由于这不是很方便,因此不同的方案系统为此提供了不同的替代方案。 在 CHICKEN 中,我们支持 DSSSL 注释,因此您可以执行以下操作:

 (define greet
   (lambda (given #!optional (surname "Smith"))
     (string-append "Hello, " given " " surname)))

Racket 中可选参数的语法实际上是非标准的,所以不要指望其他解释器来实现它。在方案中,标准功能是 RxRS 方案报告中定义的功能,R7RS 是最新的功能。但不要害怕 - 在鸡肉计划中,您可以使用optional

[syntax] (optional ARGS DEFAULT)

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

像这样使用它:

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

相关内容

  • 没有找到相关文章

最新更新