Pisałem następujące bitowego kodu do symulacji walcowania sześć jednostronne umiera kilka razy i liczenia, ile razy każda strona wylądowaliśmy:Co się dzieje z tym wspólnym kodem 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))))
Funkcja działa świetnie po raz pierwszy, ja to nazywam , ale przy kolejnych wywołaniach zmienna myList zaczyna się od wartości, jaką miał pod koniec ostatniego połączenia, zamiast być inicjalizowanym z powrotem do wszystkich zer, tak jak myślę, że powinno się zdarzyć z oświadczeniem let. Dlaczego to się dzieje?
FYI, większość ludzi piszących często lisp używa tych nazw, takich jak 'my-list' zamiast' myList'. Ponadto, nie sądzę, że potrzebujesz tego prognowania, ponieważ "treść niech jest domyślnym progiem" http://www.lispworks.com/documentation/HyperSpec/Body/s_let_l.htm (to jest jak prognowanie już tam jest). –