如何设置方案中的默认或可选参数



我正试图弄清楚如何在Scheme中设置默认或可选参数。

我尝试过(define (func a #!optional b) (+ a b)),但找不到检查b是否是默认参数的方法,因为简单地调用(func 1 2)就会出现错误:

Error: +: number required, but got #("halt") [func, +]

我也尝试过(define (func a [b 0]) (+ a b)),但我得到了以下错误:

Error: execute: unbound symbol: "b" [func]

如果有帮助的话,我使用的是repl.it 中使用的BiwaScheme

这在Racket:中运行良好

(define (func a (b 0)) ; same as [b 0]
  (+ a b))

例如:

(func 4)
=> 4
(func 3 2)
=> 5

但这不是标准语法,这取决于所使用的Scheme解释器。有一种语法可以处理可变数量的参数,它可以用来处理具有默认值的可选参数,但看起来不会那么漂亮:

(define (func a . b)
  (+ a (if (null? b) 0 (car b))))

它是如何工作的?b是参数的列表。如果它为空,则使用零,否则使用第一个元素的值。

检查您的Scheme实现是否支持SRFI 89:可选的位置和命名参数。

MIT/GNU Scheme文档。

(define (f a #!optional b)
  (+ a
     (if (default-object? b)
         0
         b)))
; test
(f 1) ; 1
(f 1 2) ; 3

最新更新