Uczę się Lispa i napisałem następującą funkcję, aby zebrać listę wyników.Efektywna funkcja zbierania w Common Lisp
(defun collect (func args num)
(if (= 0 num)
()
(cons (apply func args)
(collect func args (- num 1)))))
Produkuje podobne wyjście do wbudowanej funkcji pętli.
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)
Jednak moja zbierać funkcja wieje stos gdy próbuję wygenerować listę 100,000 elementy długie
CL-USER> (length (collect #'random '(5) 100000))
Control stack guard page temporarily disabled: proceed with caution
Podczas gdy wersja pętla nie
CL-USER> (length (loop repeat 100000 collect (random 5)))
100000
Jak mogę uczynić mój wersja bardziej wydajna pod względem przestrzeni kosmicznej, czy istnieją alternatywy dla consing? Myślę, że to rekurencyjny ogon. Używam sbcl. Każda pomoc byłaby świetna.