Estoy aprendiendo Lisp y he escrito la siguiente función para recopilar una lista de resultados.Una función de recopilación eficiente en Common Lisp
(defun collect (func args num)
(if (= 0 num)
()
(cons (apply func args)
(collect func args (- num 1)))))
Produjo una salida similar a la función de lazo incorporada.
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)
Sin embargo, mi función Collect sopla la pila cuando intento para generar una lista de 100.000 elementos de larga
CL-USER> (length (collect #'random '(5) 100000))
Control stack guard page temporarily disabled: proceed with caution
Mientras que la versión bucle no
CL-USER> (length (loop repeat 100000 collect (random 5)))
100000
¿Cómo puedo hacer que mi versión más eficiente en cuanto a espacio, ¿hay alternativas para el consumo? Creo que es una cola recursiva. Estoy usando sbcl. Cualquier ayuda sería genial.