For Development HEAD DRAFTSearch (procedure/syntax/module):

11.59 srfi.227 - 省略可能引数

Module: srfi.227
Module: srfi.227.definitions

このsrfiは、ポータブルに省略可能引数を書く方法を提供します。 Gaucheは拡張引数構文で省略可能引数を指定できますが、ポータブルではありません (手続きを作る参照)。

モジュールsrfi.227はマクロ opt-lambdaopt*-lambdalet-optionalslet-optionals*をexportします。このlet-optionals*は Gauche組み込みのlet-optionals*と異なることに注意してください。

サブモジュールsrfi.227.definitionsはさらに2つのマクロ、 define-optionalsdefine-optionals*をexportします。

Macro: opt-labmda opt-formals body …
Macro: opt*-lambda opt-formals body …

[SRFI-227]{srfi.227} lambdaと同じように、手続きへと評価されます。

opt-formalsは以下のいずれかの形式です。

(var ... (optvar init) ...)
(var ... (optvar init) ... . restvar)

varoptvarrestvarは識別子で、 initは式です。

var …は必須引数を指定します。 optvar …は省略可能引数で、与えられた実引数が足りない場合は 対応するinitが評価されその値に束縛されます。

最初の形式では、余分な引数が与えられるとエラーが投げられます。 二番目の形式では、余分な引数はリストとしてrestvarに束縛されます。

initのスコープはopt-lambdaopt*-lambdaで異なります。 opt-lambdaでは、initopt-lambdaが置かれた環境で評価されます。 opt*-lambdaではそれに加え、先行するvaroptvarも スコープに含まれます。

(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 …) と同じです。

Macro: let-optionals expr opt-formals body …
Macro: let-optionals* expr opt-formals 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と異なります。 手続きを作る参照。

Macro: define-optionals (name . opt-formals) body …
Macro: define-optionals* (name . opt-formals) body …

[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 ...))


For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT