Lispのcaseだとifの連鎖に展開されるので非効率なのが残念という話を耳にしました。結論からすると、そんなことはないけれど、最適化されなければそういうこともある、という感じです。Lispではcaseのような多方向分岐の最適化には2通りあります。caseのようなフォームを直接低レベルで効率の良い多方向分岐の記述に変換するifの連鎖を検査して、ある条件を満した場合に、低レベルで効率の良い多方向分岐の記述に変換するです。7以降のLマシン(3600系)があるようです。Generaで確認してみましたが、どうも3600シリーズ限定の機能の様子。)のような変換がされるようです。ソースがないので詳細は不明ですが、computed-goとあるので、何か計算型gotoのプリミティブがあるのかもしれません。7.1位とのことなので、1987年位にはあった機能ということになります。CLISPのほうは、caseの場合ハッシュテーブルで分岐用のテーブル作成するようです。caseをifや、condまで展開した後ではこうならないようなので、caseにはオプティマイザが付いているのでしょう。Lispでは、任意のマクロはスペシャルフォームであっても良いことになっています。マクロに位置付けられたフォームは、マクロの展開形を持っていなければならないので、処理系依存でスペシャルフォームとなっているフォームも展開されて見えます。展開するとifの連鎖になって見える処理系は、ifの連鎖から多方向分岐の最適化はしない場合でも最適化していないとは限りません。この場合、disassembleでもしてみないと分からない、ということになります。