【问题标题】:Default argument in scheme lambda function?方案 lambda 函数中的默认参数?
【发布时间】:2016-07-10 17:48:47
【问题描述】:

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

【问题讨论】:

    标签: function lambda arguments scheme chicken-scheme


    【解决方案1】:

    在普通的 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)))
    

    【讨论】:

      【解决方案2】:

      Racket 中optional arguments 的语法实际上是非标准的,所以不要指望其他解释器来实现它。在 Scheme 中,标准 功能是在 RxRS Scheme 报告中定义的,R7RS 是最新的。但不要害怕——在鸡计划中,你可以使用optional:

      [syntax] (optional ARGS DEFAULT)

      将此形式用于带有单个可选参数的过程。如果 ARGS 是空列表 DEFAULT 被评估并返回,否则列表的第一个元素 ARGS。如果 ARGS 包含多个值,则会出错。

      像这样使用它:

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

      【讨论】:

      • 在 RnRS 中没有指定的意义上,它不是“标准”,但它实际上与 SRFI 89 兼容,这对我的口味来说已经足够标准了,而且无论如何比比方说更标准, Guile 的可选参数样式(部分基于 DSSSL 的可选参数语法,如 sjamaan 的回答中所述)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      相关资源
      最近更新 更多