LET と LET* (並列バインディングと順次バインディング) の違いを理解しており、理論的な問題としては完全に理にかなっています。しかし、実際に LET が必要になったことはありますか? 私が最近見たすべての Lisp コードでは、すべての LET を変更せずに LET* に置き換えることができました。
編集: OK、私はなぜ誰かが LET* をおそらくマクロとして発明したのか理解しています。私の質問は、LET* が存在することを考えると、LET が存続する理由はあるのでしょうか? LET* が普通の LET と同様に機能しない実際の Lisp コードを書いたことがありますか?
私は効率の議論を支持しません。まず、LET* を LET と同じくらい効率的なものにコンパイルできるケースを認識することは、それほど難しいことではないようです。第 2 に、CL 仕様には、効率性を考慮して設計されたとはまったく思えないものがたくさんあります。(型宣言を伴う LOOP を最後に見たのはいつですか? それらを理解するのは非常に難しいので、私はそれらが使用されているのを見たことがありません。) 1980 年代後半の Dick Gabriel のベンチマークの前は、CLは実に遅かったです。
これは下位互換性のもう 1 つのケースのようです。賢明なことに、LET のような基本的なものを壊す危険を冒す人は誰もいませんでした。これは私の予感でしたが、LET が LET* よりもばかばかしいほど簡単に多くのことを行った、私が見逃していたばかばかしいほど単純なケースを誰も持っていないと聞いて安心しました。