[SikiLanguage] [式鬼言語航海日誌]
2008-08-24
2008/08/24_131947では昨日の続きを。『駆動』の付加的な部分ですね。
「オマケ機能かね?」
そうですね。……といってもけっこう重要な部分ではあるんですが。一つは『前処理・後処理』で、もう一つが『中断』です。
「いわゆるワインディング、アンワインディングとかの話かね?」
そうですね。Lispとかで実装されている機能です。駆動の流れを制御する方法の一つですが、このあたりは言語としてサポートしておいた方が望ましいので付加的要素として追加しています。
始めに『前処理・後処理』について。これはあるCellが実際に処理される前と実行された後に行う処理になります。
「文字通りだね」
そうですね。この機能はFilament、Fiber、Thread、Yarnにあるのですが、この機能を持つCellは下記のような特殊な構造になっています。
- 『前処理・後処理』可能なCell
- Link: [<Enter>, <Leave>]
- List: [実行するコマンド列]
- <Enter>, <Leave>
- List: [『前処理・後処理』で実行するコマンド列]
『前処理・後処理』可能なCellは実行するときに <Enter>、<Leave>とListの中身を確認して、もし実行する中身がある場合はそのCellを実行します。
優先順位は <Enter> >> Listの中身 >> <Leave>となっていますので、結局のところ実行前に<Enter>の中身を実行して、実行後に<Leave>の中身を実行します。
「簡単な話だね」
さて、次は『中断』です。
こっちはちょっとややこしいのですが、『Listのトップに積まれたCellが特別なCellのUndefinedである場合、Listの中身を実行しないで中断処理をする』という処理になります。
「なんか特別なことをしてるのかね?」
そうですね。中断処理はちょっと特別で、
- <Enter> << <Leave>の優先度で、中身を全て実行する。
- <Enter>、<Leave>実行後に
- <Enter>, <Leave>を初期化する(詳細は別途)
- ListのトップのUndefinedを取り去る
という処理を行い、中断後のCellを再開しても問題が発生しないように工夫しています。
中断時・再開時に前処理・後処理を行うことによって、中断したときもリソースを握り続けるということが発生しないようにしているわけですね。
「ふうん。処理の中断というとコルーチンが思い付くけど、これはCellをコルーチン化しても問題にならないように実装を行った、つうことかね?」
そんな感じですね。
制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)