Shammer's Philosophy

My private adversaria

eval-whenを試す

スクリプトとして実行された場合のみ実行したいという処理をどうすればいいか。どうやらeval-whenを使用すればこれができそうに思った。過去にちょっとだけ見たことがあるようだ。パッケージ名の取得でコケた・・・ - Shammerismでちょっとだけ言及しているが、その当時はeval-whenをどう使うのかほとんど理解できなかったようだ。

CLHS: Special Operator EVAL-WHENによれば、eval-whenの引数として有効なのは以下の3つ。

  • :compile-toplevel
  • :load-toplevel
  • :execute

スクリプトとして実行された場合のみ実行されるのは:executeを指定した場合だった。:load-toplevelかと思ったがそうではないらしい。

(eval-when (:execute)
  (format t "Hello~%"))

(quit)

これを実行すると以下のようになる。

$ ccl64 -l eval-when-test.lisp 
Hello
$ 

:executeを:load-toplevelや:compile-toplevelにした場合は実行されない。:compile-toplevelはコンパイルの時のみ実行されるのだろうが、:load-toplevelはよくわからない。:executeとどう違うのだろうか。まあ例を見ても:load-toplevelのみのものはなく、他のものと一緒に使用されている。:load-toplevelのみを使用する場合はどういう場合か、については考えるだけ時間の無駄な気がしてきた。色々書いていけばそういう場面に出くわすこともあるかもしれない。