Lispでは、実行時、コンパイル時、リード時、その他色々なタイミングでの評価を活用しますが、その制御に専ら使われるのが、eval-whenです。:load-toplevel)を全部付けるかです。実際の所は全部盛りを知っていれば問題ないのですが、入れ子になった場合や、全部盛り以外の組み合わせの挙動を確認してみようかなと思います。指定の組み合わせを眺めてみるこんな感じのコードで、適当なファイルに組み合わせを書き出します。(terpri))))書き出したコードを実際にコンパイルしたりロードしたりで実行してみます。上記の結果を評価タイミングごとに眺めていきます。-toplevelと付いていることからも想像できるように、:compile-とload-はトップレベルに置かれないと評価されません。eval-whenの中はトップレベルなので、入れ子にしてもトップレベル扱いです。:executeexecuteは、実行時の評価です。式をevalしたり、コンパイルしていないソースファイルをloadした場合のフェイズといえるでしょう。:executeが含まれたeval-whenの中だけ評価されているのが分かります。:compile-toplevel:compile-toplevelは、コンパイル時です。eval-whenの直下のフォームと入れ子になった:executeが評価されます。ややこしいのが、コンパイル時には、eval-whenの:load-toplevel指定の中身も見る(=コンパイルする)ことですが、中身は見ますが、内側に:compile-toplevelを指定しないとコンパイル時には評価されません。:load-toplevel)):load-toplevel:load-toplevelは、コンパイル済みのファイルであるfaslをロードした場合の評価フェイズです。ロードというと色々ややこしいので、以降、fasloadと呼びます。fasloadの場合は、:load-toplevelを入れ子にすれば、:load-toplevelの中は評価しますが、:executeの中身はみません。上述のように:compile-toplevelは入れ子にしても機能しますが、それはコンパイル時に評価されるものなのでfasload時には評価されません。:load-toplevel))応用の考察マクロ展開時限定で何かを評価するにはマクロはコンパイル時に展開されますが、実行時でも展開される可能性はある(インタプリタ動作の場合)ので下記のようになるでしょうか。fasloadではコンパイル済みの筈なので、マクロ展開が起きることはありません。....)マクロ展開時限定で何かしたいことがあれば......ですが。defpackageのシンボル汚染問題を解消するdefpackage展開用のパッケージを作成して、コンパイル時のみの評価とすれば、fasload時には展開用のパッケージは存在しなくても良いことになります。foo::a)良く考えれば、コンパイル時にdefpackageによって使われたシンボルも、別のイメージにfasloadした時には居なくても良いので、cl-userで書いたのと大した違いはないですね。考えると、defpackageのシンボル汚染問題もコンパイル時のイメージ限定なのかなと。まとめはまり所としては、:load-toplevelの中の:compile-toplevelがコンパイル時に評価されるというのがややこしいloadという関数名と、:load-toplevelという名前が誤解を招くloadでlispファイルを読み込めば:executeloadでfaslファイルを読み込めば:load-toplevel位でしょうか。Lispでloadに一本化されたようですね。以上、eval-whenの考察でした。