復帰文とブロック
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/04 03:18 UTC 版)
「Smalltalk」の記事における「復帰文とブロック」の解説
Smalltalk のブロックは一種の制御構文であるという性質上、復帰文が他の言語と比べ極めて異質な振る舞いをする。 example| block |block := [ ^ 1 ].block value. "ブロックを実行"^ 0. 上記のメソッドを登録したオブジェクトに#example セレクターを使ったメッセージを送ると結果としては何が返ってくるか。Smalltalk 以外の言語では 0 が返ってくるのが一般的であるが Smalltalk では 1 が返ってくる。Smalltalk はブロック内の復帰文からでもメソッド自体を抜けることができるようになっている。この例では、「block value.」を評価し、block 中の「^ 1.」で制御が戻ると example 自体も中断して結果を返す。そして example は戻り値として block が戻した 1 を戻すようになっている。 callee: aBlockaBlock value.^ 2. caller| block |block := [ ^ 1 ].self callee: block.^ 0. 上記の様なメソッドをまたいでブロックを評価する場合はどうなるだろうか、この場合も Smalltalk は example の戻り値として block の戻り値である1を返す。Smalltalk はブロック内で復帰文が実行された際、ブロックの生成地点の呼び出し元までコンテキストを巻き戻すようになっている。この特性により Smalltalk では、#ifTrue:ifFalse: セレクターを使った分岐でメソッドを中断したり #repeat セレクター等を使った反復処理を復帰文だけで中断する事ができるようになっている。 exampleBlock^ [ ^ 1 ]. callee: aBlockaBlock value.^ 2. caller| block |block := self exampleBlock.self callee: block.^ 0. ただし、上記の様にブロックを生成したコンテキストと、ブロックを評価する際のコンテキストが枝分かれする様な場合は復帰文を実行する事はできない。この場合は BlockContext が例外を出力し処理が停止してしまう。
※この「復帰文とブロック」の解説は、「Smalltalk」の解説の一部です。
「復帰文とブロック」を含む「Smalltalk」の記事については、「Smalltalk」の概要を参照ください。
- 復帰文とブロックのページへのリンク