Вам не нужно заключать символы в кавычки в CASE
.
Символы в предложениях CASE не оцениваются.
(case tile-type
(wall ...)
(door ...))
WALL
иDOOR
являются чисто символами и не оцениваются как переменные.
Читатель Lisp читает 'foo
как (quote foo)
.
Вы писали:
(case tile-type
('wall ...)
('door ...))
То естьэквивалент:
(case tile-type
((quote wall) ...)
((quote door) ...))
Но вы не можете заключить в кавычки символ в CASE
.Вы должны предоставить символы в виде буквенных констант.
Если вы напишите:
(let ((bar 'foo)
(baz 'foo))
(case bar
(baz :we-have-a-foo-through-baz)
(foo :we-really-have-a-foo)))
Это вернет :WE-REALLY-HAVE-A-FOO
.Поскольку CASE
использует постоянные данные, а не переменные.
CASE
принимает список элементов.Поскольку у вас есть QUOTE
в качестве символа в более чем выражении, компилятор выдает предупреждение.
Как я уже сказал, цитирование невозможно, поскольку элементы не оцениваются.
Какдля CASE
принятия списка элементов в пунктах это выглядит следующим образом:
(case tile-type
((door wall) ...)
((floor window painting) ...))
Для символа WALL
необходимо убедиться, что он находится в нужной упаковке при созданииobject.
Лучше использовать символ ключевого слова, например :wall
.Тогда вам не нужно экспортировать его, и не возникает путаницы в том, в какой упаковке находится символ.
О форматировании кода : у вас был список с маркерами и сразу после негораздел кода.Это не отображается так, как вы ожидаете.Я добавил текст «Код:» перед кодом.Тогда рендеринг работает как положено.