我正试图弄清楚如何在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