He escrito el siguiente fragmento de código para simular rodar una de seis caras morir varias veces y contar cuántas veces cada lado aterrizó:¿Qué está pasando con este código Common Lisp?
(defun dice (num)
(let ((myList '(0 0 0 0 0 0)))
(progn (format t "~a" myList)
(loop for i from 1 to num do
(let ((myRand (random 6)))
(setf (nth myRand myList) (+ 1 (nth myRand myList)))))
(format t "~a" myList))))
La función funciona muy bien la primera vez que lo llamo , pero en llamadas posteriores, la variable myList comienza en el valor que tenía al final de la última llamada, en lugar de volver a inicializarse en ceros, como creía que debería ocurrir con la instrucción let. ¿Por qué pasó esto?
Para su información, la mayoría de las personas que escriben el ceceo común actualmente usan nombres como 'mi-lista' en lugar de' miLista'. Además, no creo que necesite ese progn porque "el cuerpo de una let es un prognóstico implícito" http://www.lispworks.com/documentation/HyperSpec/Body/s_let_l.htm (es como si el progn ya estuviera allí)) –