私は、乗算関数のばかげた非末尾再帰バージョンを作成し、それが適切な TCO のものとどのように比較されるかを確認しようと考えました。ただし、REPL (java -cp <classpath> clojure.main
構成済みの Emacs を使用していますinferior-lisp
) とコマンドラインからプログラムを呼び出すときの両方で、何らかの最適化/メモ化が行われているようです。実際、結果は REPL の方がはるかに顕著です。
(defn mult-silly [n m]
(if (> n 0)
(+ m (mult-silly (dec n) m))
0))
(dotimes [_ 5]
(println (time (mult-silly 5000 4))))
上記はREPLで生成されます:
user=> #'user/mult-silly
user=> "経過時間: 10.697919 ミリ秒"
20000
"経過時間: 3.069106 ミリ秒"
20000
"経過時間: 2.301474 ミリ秒"
20000
"経過時間: 1.285696 ミリ秒"
20000
"経過時間: 415855ミリ秒"
20000
なぜ私はこれを見るのですか?