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

6.17 ボックス

ボックスは0個以上の値を格納できる変更可能なコンテナです。 小さなデータストア、あるいは間接参照のための「ポインタ」として使うことができます。

伝統的に、この目的にはリストやベクタが使われてきました。 しかし、リストやベクタはオブジェクトの列を扱うものと考えられます。 ボックスを使うことにより、目的がオブジェクトの列ではなく間接参照であると強調できます。

ボックスはSRFI-111で導入され、R7RS-largeにscheme.boxとして採り入れられました。 SRFI-195はボックスを多値に拡張しました。

SRFIではいくつかの詳細を実装依存にしています。Gaucheの選択は次のとおりです。

ポータブルなコードを書いている時は、上記equal?の振る舞いに依存しないように 気をつけてください。

Function: box val …

[R7RS box][SRFI-195] val …を内容とする新たなボックスを作って返します。

Function: box? obj

[R7RS box] objがボックスなら#tを、そうでなければ#fを返します。

Function: box-arity box

[SRFI-195] boxが保持している値の数を返します。

Function: unbox 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)>
Function: unbox-value box i

[SRFI-195] boxの値のうち、i番めのものを返します。

註: これは一般化セッターと一緒に使えます。Gaucheの独自拡張です。

(define mb (box 10 20 30))
(inc! (unbox-value mb 1)
mb ⇒ #<mv-box[3] 10 21 30>
Function: set-box! box val …

[R7RS box][SRFI-195] boxの内容をval …で置き換えます。 値の数はボックスのアリティと同じでなければなりません。 戻り値は未定義です。

Function: set-box-value! box i val

[SRFI-195] boxi番めの値をvalで置き換えます。 戻り値は未定義です。



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