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

11.57 srfi.222 - 複合オブジェクト

Module: srfi.222

複合オブジェクトは、オブジェクトの並びをまとめたもので、それ自体は変更不可なオブジェクトです。 複合オブジェクト以外の任意オブジェクトを要素とすることができます。 複合オブジェクトを含めようとした場合は、 その要素が取り出されてそれぞれ結果の複合オブジェクトに埋め込まれます。 つまり複合オブジェクトがネストすることはありません。

これは複合コンディション (see コンディション) の機能を抽象化したものです。 ただし、Gaucheでは複合コンディション自体は複合オブジェクトとしては実装されていません。

このモジュールは主に互換性のために提供されています。 R7RSレコード(see gauche.record - レコード型)と併用すれば、 移植可能な形でレコードの多重継承を扱うことができます。

Function: make-compound obj …

[SRFI-222]{srfi.222} obj …をサブオブジェクトとして持つ複合オブジェクトを作って返します。 objは任意のSchemeオブジェクトですが、それが複合オブジェクトだった場合は、 そのサブオブジェクトがそこに展開されて使われます。

(make-compound 1 2 3)
 ⇒ #<compound-object (1 2 3)>
(make-compund 0 (make-compound 1 2 3) 4 5)
 ⇒ #<compound-object (0 1 2 3 4 5)>
Function: compound? obj

[SRFI-222]{srfi.222} objが複合オブジェクトなら#tを、そうでなければ#fを返します。

Function: compound-subobjects obj

[SRFI-222]{srfi.222} objが複合オブジェクトなら、そのサブオブジェクトのリストを、 そうでなければobjひとつを要素とするリストを返します。

すなわち、返されるのは常に、複合オブジェクトを含まないオブジェクトのリストです。

Function: compound-length obj

[SRFI-222]{srfi.222} objが複合オブジェクトなら持っているサブオブジェクトの数を、 そうでなければ1を返します。

Function: compound-ref obj k

[SRFI-222]{srfi.222} objが複合オブジェクトならk番目のサブオブジェクトを返します。 そうでなければ、kは0でなければならず、その場合obj自身が返されます。

kが非負の正確な整数でなかったり、指定可能範囲外であればエラーが投げられます。

Function: compound-map mapper obj

[SRFI-222]{srfi.222} objの持つサブオブジェクトそれぞれにmapperを適用し、その結果を集めた 複合オブジェクトを作って返します。objが複合オブジェクトでなければ、 あたかもobj自身を唯一のサブオブジェクトとする複合オブジェクトであるかのように 扱われます。mapperが複合オブジェクトを返した場合、そのサブオブジェクトが 取り出されて結果に使われることに注意してください。つまり、 結果の持つサブオブジェクトの数は、objの持つサブオブジェクトと異なる場合があります。

(compound-map (cut + 1 <>) (make-compound 1 2 3))
 ⇒ #<compound (2 3 4)>
(compound-map (cut make-compound <> 'x) (make-compound 1 2 3))
 ⇒ #<compound (1 x 2 x 3 x)>
(compound-map (cut + 1 <>) 3)
 ⇒ #<compound (4)>
Function: compound-map->list mapper obj

[SRFI-222]{srfi.222} mapperobjの各サブオブジェクトに適用し、結果のリストを返します。 objが複合オブジェクトでなければ、mapperを直接objに適用し、 結果をリストにくるんで返します。

compound-mapと異なり、mapperの結果が複合オブジェクトであった場合でも それがそのまま結果のリストに現れます。つまり、結果のリストの長さは常に (compound-length obj)と同じです。

(compound-map->list (cut + 1 <>) (make-compound 1 2 3))
 ⇒ (2 3 4)
(compound-map->list (cut make-compound <> 'x) (make-compound 1 2 3))
 ⇒ (#<compound (1 x)> #<compound (2 x)> #<compound (3 x)>)
(compound-map->list (cut + 1 <>) 3)
 ⇒ (4)
Function: compound-filter pred obj

[SRFI-222]{srfi.222} objのサブオブジェクトにそれぞれpredを適用し、それが真の値を返した サブオブジェクトのみを集めて新たな複合オブジェクトを作って返します。 objが複合オブジェクトでなければ、あたかもそれ自身を唯一のサブオブジェクトに持つ 複合オブジェクトのように扱われます。

(compound-filter odd? (make-compound 1 2 3))
 ⇒ #<compound (1 3)>
(compound-filter odd? 1)
 ⇒ #<compound (1)>
(compound-filter odd? 2)
 ⇒ #<compound ()>
Function: compound-predicate pred obj

[SRFI-222]{srfi.222} objが述語predを満たすか、objが複合オブジェクトであり いずれかのサブオブジェクトがpredを満たせば#tを、 そうでなければ#fを返します。

Function: compound-access pred acc default obj

[SRFI-222]{srfi.222} objが述語predを満たした場合、objaccが適用され、 その結果が返されます。そうでなく、objが複合オブジェクトの場合は、 そのサブオブジェクトが順にpredを満たすかどうか検査され、最初に満たした サブオブジェクトに対してaccが適用され、その結果が返されます。 全てに当てはまらない場合はdefaultが返されます。

(define-record-type <foo> make-foo foo?
  (f foo-f))

(define-record-type <bar> make-bar bar?
  (b bar-b))

(define c (make-compound (make-foo "foo!") (make-bar "bar!") '(ca . cd)))

(compound-access foo? foo-f 'none c) ⇒ "foo!"
(compound-access bar? bar-b 'none c) ⇒ "bar!"
(compound-access pair? car  'none c) ⇒ ca
(compound-access char? char->integer 'none c) ⇒ none


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