srfi.227
- 省略可能引数 ¶このsrfiは、ポータブルに省略可能引数を書く方法を提供します。 Gaucheは拡張引数構文で省略可能引数を指定できますが、ポータブルではありません (手続きを作る参照)。
モジュールsrfi.227はマクロ
opt-lambda
、opt*-lambda
、let-optionals
、
let-optionals*
をexportします。このlet-optionals*
は
Gauche組み込みのlet-optionals*
と異なることに注意してください。
サブモジュールsrfi.227.definitions
はさらに2つのマクロ、
define-optionals
とdefine-optionals*
をexportします。
[SRFI-227]{srfi.227
}
lambda
と同じように、手続きへと評価されます。
opt-formalsは以下のいずれかの形式です。
(var ... (optvar init) ...) (var ... (optvar init) ... . restvar)
var、optvar
、restvar
は識別子で、
initは式です。
var …は必須引数を指定します。 optvar …は省略可能引数で、与えられた実引数が足りない場合は 対応するinitが評価されその値に束縛されます。
最初の形式では、余分な引数が与えられるとエラーが投げられます。 二番目の形式では、余分な引数はリストとしてrestvarに束縛されます。
initのスコープはopt-lambda
とopt*-lambda
で異なります。
opt-lambda
では、initはopt-lambda
が置かれた環境で評価されます。
opt*-lambda
ではそれに加え、先行するvarとoptvarも
スコープに含まれます。
(let ((x 1)) ((opt-lambda (x (y (+ x 1))) (list x y)) 10)) ⇒ (10 2) (let ((x 1)) ((opt*-lambda (x (y (+ x 1))) (list x y)) 10)) ⇒ (10 11)
(opt*-lambda (v … (w init) …) body …
は
Gaucheの拡張引数を使った
(lambda (v … :optional (w init) …) body …)
と同じです。
[SRFI-227]{srfi.227
}
opt-formalを使ってexprの結果を分解する糖衣構文です。
(let-optionals expr opt-formals body ...) ≡ ((opt-lambda opt-formals body ...) expr) (let-optionals* expr opt-formals body ...) ≡ ((opt*-lambda opt-formals body ...) expr)
註: Gaucheの組み込みのlet-optionals*
は、
必須パラメータを取らないという点でこのsrfiと異なります。
手続きを作る参照。
[SRFI-227]{srfi.227.definitions
}
これら2つのフォームはサブモジュールsrfi.227.definitions
で提供されます。
(define-optionals (name . opt-formals) body ...) ≡ (define name (opt-lambda opt-formals body ...)) (define-optionals* (name . opt-formals) body ...) ≡ (define name (opt*-lambda opt-formals body ...))