srfi.222
- 複合オブジェクト ¶複合オブジェクトは、オブジェクトの並びをまとめたもので、それ自体は変更不可なオブジェクトです。 複合オブジェクト以外の任意オブジェクトを要素とすることができます。 複合オブジェクトを含めようとした場合は、 その要素が取り出されてそれぞれ結果の複合オブジェクトに埋め込まれます。 つまり複合オブジェクトがネストすることはありません。
これは複合コンディション (see コンディション) の機能を抽象化したものです。 ただし、Gaucheでは複合コンディション自体は複合オブジェクトとしては実装されていません。
このモジュールは主に互換性のために提供されています。
R7RSレコード(see gauche.record
- レコード型)と併用すれば、
移植可能な形でレコードの多重継承を扱うことができます。
[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)>
[SRFI-222]{srfi.222
}
objが複合オブジェクトなら#t
を、そうでなければ#f
を返します。
[SRFI-222]{srfi.222
}
objが複合オブジェクトなら、そのサブオブジェクトのリストを、
そうでなければobjひとつを要素とするリストを返します。
すなわち、返されるのは常に、複合オブジェクトを含まないオブジェクトのリストです。
[SRFI-222]{srfi.222
}
objが複合オブジェクトなら持っているサブオブジェクトの数を、
そうでなければ1を返します。
[SRFI-222]{srfi.222
}
objが複合オブジェクトならk番目のサブオブジェクトを返します。
そうでなければ、kは0でなければならず、その場合obj自身が返されます。
kが非負の正確な整数でなかったり、指定可能範囲外であればエラーが投げられます。
[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)>
[SRFI-222]{srfi.222
}
mapperをobjの各サブオブジェクトに適用し、結果のリストを返します。
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)
[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 ()>
[SRFI-222]{srfi.222
}
objが述語predを満たすか、objが複合オブジェクトであり
いずれかのサブオブジェクトがpredを満たせば#t
を、
そうでなければ#f
を返します。
[SRFI-222]{srfi.222
}
objが述語predを満たした場合、objにaccが適用され、
その結果が返されます。そうでなく、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