「Erlangメッセージによる割り込み -- 継続への入り口として」において、Erlangで実際に使われている継続渡しっぽい手法を紹介しました。
それで、なーんか似たようなことをやったような、、、と、はるか昔の記憶が刺激されて、あーあー思い出したよ。
むかし、僕、MS-DOSのバッチファイルでテキストエディタ作ったことがあるんですよ(って、どんだけバカだったかが分かる)。それをASCIIネットのjunk.testにアップロードしましたね(って、どんだけ昔かが分かる)。
今はcallでサブバッチファイルを呼び出せるのですが、昔はそんなのなくて、バッチフィルからバッチファイルを呼び出すのは無理でした。チェーンならできるんですけどね。呼び出しじゃなくてチェーンて何?って人は次を実行してみてください。
main.bat
@echo off
echo main 1
sub
echo main 2
sub.bat
@echo off
echo sub
次のようになります。
>main
main 1
sub>
sub.batに制御が行ったきりになって、echo main 2
は実行されません。
で困った僕は、次のような方法を使っていました。
まず、main.batのめぼしい場所にラベルを付けます。こんな感じ:
ラベルを付けても実行内容には何の影響もありません。
@echo off
:L0
echo main 1
:L1
sub
:L2
echo main 2
そして、main.batの先頭に goto %1
を付けます。%1
は第1引数を表すので、第1引数で指定された場所から実行を開始することになります。この変更で、mainの呼び出しは main L0 とする必要が生じす。
次、sub.batは次のようにします。
お尻に
@echo off
echo sub
%1 %2
%1 %2
ってオマジナイが付きました。これは、第1引数で指定されたコマンドに第2引数で指定されたコマンド引数を付けて実行することを指示します。つまり、%1 %2
が、sub.batに続く処理になるわけ。さて、main.batの最終版。
@echo off
goto %1
:L0
echo main 1
:L1
sub main L2
:L2
echo main 2
subへと制御を移す(チェーンする)とき、subにmain L2
と引数を渡しているので、subの最後でmain L2
が実行されます。これで再びmainに制御が戻ってきますが、先頭から実行開始されるのではなくて、ラベルL2のところから実行されます。L2ってのは、subの仕事が終えた後になるので、まるで呼び出しが戻ってきたように制御がやり取りされるのです。
>main L0
main 1
sub
main 2>