Scala 2.8.x では、@tailrec
コンパイラが注釈付きメソッドで末尾呼び出しの最適化を実行できない場合にコンパイル時エラーを発生させる新しい注釈 ( ) が追加されました。
に関してClojureに同様の機能はありloop/recur
ますか?
編集: 私の質問に対する最初の回答(ありがとう、Bozhidar Batsov)を読み、Clojureのドキュメントをさらに検索した後、私はこれに出くわしました:
(recur exprs*)
expr を順番に評価し、並行して、再帰ポイントのバインディングを expr の値に再バインドします。再帰ポイントが fn メソッドの場合、params を再バインドします。再帰ポイントがループの場合は、ループ バインディングを再バインドします。その後、実行は再帰ポイントに戻ります。recur 式は、再帰ポイントのアリティと正確に一致する必要があります。特に、再帰ポイントが可変引数 fn メソッドの先頭にある場合、残りの引数の収集はありません。単一の seq (または null) を渡す必要があります。末尾位置以外での再発はエラーです。
recur は、Clojure でスタックを消費しない唯一のループ構造であることに注意してください。末尾呼び出しの最適化はなく、未知の境界のループに自己呼び出しを使用することは推奨されません。recur は機能的であり、末尾位置での使用はコンパイラによって検証されます[強調は私のものです]。
(def factorial
(fn [n]
(loop [cnt n acc 1]
(if (zero? cnt)
acc
(recur (dec cnt) (* acc cnt))))))