私はLispを学んでおり、次の関数を書いて結果のリストを収集しています。Common Lispの効率的なcollect関数
(defun collect (func args num)
(if (= 0 num)
()
(cons (apply func args)
(collect func args (- num 1)))))
組み込みループ関数と同様の出力を生成します。私はループのバージョンは私が作ることができる方法ではない
CL-USER> (length (loop repeat 100000 collect (random 5)))
100000
ないのに対し
CL-USER> (length (collect #'random '(5) 100000))
Control stack guard page temporarily disabled: proceed with caution
10万要素の長いリストを生成しようとすると、
CL-USER> (collect #'random '(5) 10)
(4 0 3 0 1 4 2 1 0 0)
CL-USER> (loop repeat 10 collect (random 5))
(3 3 4 0 3 2 4 0 0 0)
しかし私コレクト機能は、スタックを吹きますより効率的なバージョンのバージョン、consingの代替手段はありますか?私はそれが尾を再帰的だと思う。私はsbclを使用しています。どんな助けも素晴らしいだろう。