Posted 2015-08-05 14:28:49 GMT

ぼーっとしていて、ふと、ファイルの中で throw するのって何かに使えないだろうか、と思ったのですが、もしかしたら、コンパイルとロードを中断するのに使えるかもなあと思い、色々応用を考えてみました。

結論としては、 load の場合は、まだ使い出がある気がしましたが、 compile-file となると単に途中で放棄されるだけなのでfaslもできず役に立ちそうにありません。

途中までコンパイルができたら、古のLispや、Scheme、25年前の位のCommon LispのコードをANSI Common Lispに移植する時に便利そうなんだけどなあ※と思ったのですが、ファイルの末尾までを無視するなら、ファイルの処理中に throw などという変なことをしなくてもリーダーマクロを書けば良いだけだなと気付きました。

こんな感じに書けます。

set-macro-character #\ETX lambda ( s c ) declare ignore c loop or read-char s nil return values

#\ETXは、制御文字の^Cですが、End of Textなので丁度いいかなと思い採用。

使い勝手は、まあまあですね。

大規模に #||# でコメントアウトするよりは手軽かなといった所です。

問題としては、リードテーブルに定義がないと機能しないという所ですね。まあ大抵は大丈夫です。

※自分は、移植の手順の最初としては、まず何も考えずにコンパイルしてみるのが好きです。

全体的なコンパイルの失敗具合を眺めて、それからファイルごとの対処を始めますが、とりあえずコンパイルを成功させたいので、先頭から成功する所までを残してざっくりコメントアウトしたりすることが多いです。↩

■

