{ ... stop ... } stopped
という構文で、stoppedはパラメータとしてスタックに積まれたプロシージャを普通に実行する。
そして、このプロシージャが終わるか、あるいはプロシージャの中でstopが実行されるとstoppedの後ろに制御が移る。
stopはどこで実行してもいい。
このとき、スタックにはstopが実行されていればtrue、実行されていなければfalseが積まれるので、直後にifなどを置けばどちらか判別できる。
これ以外のオペランドスタックの操作はしてくれない。
デフォルトのエラーハンドラはエラー情報を$errorという辞書に入れてstopを実行する。 もしstoppedされていなければ、インタープリタがユーザプログラム実行前に作ったstoppedの後ろに制御が移る。 最終的にここからerrordict内のhandleerrorが呼び出されて、あのメッセージが表示される(PLRM 3.11.2)。 だから、全体のエラーレポートを書き換えたいなら、errordictのhandleerrorを書き換えればいい。
{ ... } stopped { $error /newerror get { stop % throw error again. } { % control reaches here if stop has been executed. } ifelse } if
mark { ... } stopped { cleartomark $error /newerror get { stop } { /myerrorobject errordict /ioerror get exec } ifelse } if pop % discard the markただし、配列や辞書の定義中にstopすると、cleartomarkが配列などの頭までしかクリアしてくれないので注意。 あと、$errorとかをどうすればいいのかは知らん。 より本格的には、プロシージャに入ったところでmark、エラーの場合はcleartomarkでパラメータをスタックに置いたままにしてエラーを投げ、正常に終了した場合はcleartomarkの後にパラメータを捨てて結果をスタックに置く、ということになるだろうけど(面倒く・・・んがんぐ)。
Copyright (C) 2012 You SUZUKI
$Id: stop-error.htm,v 1.2 2012/11/01 14:24:36 you Exp $