ボックスは0個以上の値を格納できる変更可能なコンテナです。 小さなデータストア、あるいは間接参照のための「ポインタ」として使うことができます。
伝統的に、この目的にはリストやベクタが使われてきました。 しかし、リストやベクタはオブジェクトの列を扱うものと考えられます。 ボックスを使うことにより、目的がオブジェクトの列ではなく間接参照であると強調できます。
ボックスはSRFI-111で導入され、R7RS-largeにscheme.box
として採り入れられました。
SRFI-195はボックスを多値に拡張しました。
SRFIではいくつかの詳細を実装依存にしています。Gaucheの選択は次のとおりです。
equal?
で比較すると、ボックス自体がeqv?
でない場合、
その内容をequal?
で比較します。
SRFIでは、二つのボックスがeqv?
でない場合のequal?
の振る舞いは
規定されていません。
ポータブルなコードを書いている時は、上記equal?
の振る舞いに依存しないように
気をつけてください。
[R7RS box][SRFI-195]
val
…を内容とする新たなボックスを作って返します。
[R7RS box]
objがボックスなら#t
を、そうでなければ#f
を返します。
[SRFI-195] boxが保持している値の数を返します。
[R7RS box] boxの内容を返します。boxがN個の値を保持していれば、N個の値が返されます。
註: boxが一つの値だけを保持している場合、unbox
は一般化セッターと
一緒に使えます。これはGaucheの独自拡張です。
(define b (box 1)) (set! (unbox b) 2) b ⇒ #<box 2> (define b (box '())) (push! (unbox b) 'x) (push! (unbox b) 'y) b ⇒ #<box (y x)>
[SRFI-195] boxの値のうち、i番めのものを返します。
註: これは一般化セッターと一緒に使えます。Gaucheの独自拡張です。
(define mb (box 10 20 30)) (inc! (unbox-value mb 1) mb ⇒ #<mv-box[3] 10 21 30>
[R7RS box][SRFI-195] boxの内容をval …で置き換えます。 値の数はボックスのアリティと同じでなければなりません。 戻り値は未定義です。
[SRFI-195] boxのi番めの値をvalで置き換えます。 戻り値は未定義です。