如何在scheme中设置默认或可选参数?

时间:2016-03-25 02:39:22

标签: scheme lisp

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

如果有帮助我使用BiwaScheme

中使用的repl.it

3 个答案:

答案 0 :(得分:2)

这在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是参数的列表。如果它为空,则使用零,否则使用第一个元素的值。

答案 1 :(得分:1)

检查您的Scheme实施是否支持SRFI 89: Optional positional and named parameters

答案 2 :(得分:0)

为此目的的MIT / GNU方案doc

(define (f a #!optional b)
  (+ a
     (if (default-object? b)
         0
         b)))

; test
(f 1) ; 1
(f 1 2) ; 3