主な質問: 私は、テール コール最適化 (TCO) の最も重要なアプリケーションを、再帰呼び出しをループに変換するものと考えています (再帰呼び出しが特定の形式を持つ場合)。より正確には、これを機械語に翻訳すると、通常はある種の一連のジャンプに翻訳されます。ネイティブ コード (SBCL など) にコンパイルする一部の Common Lisp および Scheme コンパイラは、末尾再帰コードを識別し、この変換を実行できます。Clojure や ABCL などの JVM ベースの Lisp では、これを行うのに問題があります。これを防止または困難にするマシンとしての JVM についてはどうですか? 理解できません。JVM には明らかにループに関する問題はありません。TCO を実行する方法を理解する必要があるのはコンパイラであり、コンパイル先のマシンではありません。
関連する質問: Clojureは一見再帰的なコードをループに変換できます: プログラマーが関数の末尾の呼び出しをキーワード に置き換えると、TCO を実行しているかのように動作しますrecur
。しかし、たとえば SBCL や CCL のように、コンパイラにテール コールを識別させることが可能である場合、Clojure コンパイラは、テール コールを処理する方法で処理する必要があることを認識できないのはなぜrecur
でしょうか?
(申し訳ありませんが、これは間違いなく FAQ であり、上記の発言は私の無知を示していると確信していますが、以前の質問を見つけることができませんでした。)