Это объявление отлично:
(defparameter *rooms* (list 0))
Следующие не очень хороши:
(defvar counter 0)
(defvar room-num 0)
Специальные переменные, объявленные с defvar
, должны именоваться с наушниками , ie. пара звездочек, как вы сделали для предыдущей переменной. При чтении кода полезно знать, что некоторые переменные являются глобальными.
Кроме того, вы пишете скрипт, который манипулирует глобальным состоянием, вместо того, чтобы определять функцию, которая только изменяет локальное состояние. Для небольшого примера это нормально, но хорошим упражнением будет инкапсуляция этого скрипта в функцию.
(loop
(setq room-num(read))
(if (and
(> counter 0)(equal t (find room-num '(*room*)))
)
(progn
(print "Room already exists:")
(return 1)
)
)
(push room-num (cdr (last *rooms*)))
(setq counter (+ counter 1))
)
Форматирование нестандартное, пожалуйста, следуйте идиоматический c стиль, Вот ваш переформатированный код:
(loop
(setq room-num (read))
(when (and (> counter 0)
(equal t (find room-num '(*room*))))
(print "Room already exists:")
(return 1))
(push room-num (cdr (last *rooms*)))
(setq counter (+ counter 1)))
Я заменил (if A (progn B C))
на (when A B C)
, что проще для чтения.
Теперь ваша проблема здесь:
(equal t (find room-num '(*room*)))
Вы пытаетесь найти room-num
в списке, который буквально содержит символ *room*
, а не значение переменной с именем *room*
. Это потому, что вы процитировали список: '(*room*)
- это то же самое, что и (quote (*room*))
, который при оценке просто возвращает форму, прочитанную читателем Lisp, то есть список из одного символа.
Вам просто нужно позвоните (member room-num *room*)
, чтобы проверить членство, и вам не нужно сравнивать возвращаемое значение (member ...)
с t
, используя (equal t ...)
: если тест пройден успешно, он будет ненулевым, ie. true.
Также:
(push room-num (cdr (last *rooms*)))
Вам не нужно указывать sh комнату как последний элемент, просто поместите ее перед:
(push room *rooms*)
В любом случае порядок не имеет значения в вашем случае, и вы избегаете одного обхода списка даром с помощью last
.