Я написал этот фрагмент кода на обычном языке (игнорируйте ... поскольку вставлять эту часть здесь бессмысленно).
(case turn
(*red-player* ...)
(*black-player* ...)
(otherwise ...))
red-player и black-player - это переменные, которые были определены с помощью оператора defvar, чтобы «смоделировать» оператор #define в C.
(defvar *red-player* 'r)
(defvar *black-player* 'b)
Как вы можете себе представить, когда переменная turn
получает либо значение *red-player*
('r), либо значение *black-player*
(' b), оператор case не работает должным образом, как ожидается этот ход содержит *red-player*
как литерал, а не содержимое переменной *red-player*
.
Я знаю, что могу легко это исправить, используя операторы cond или if + equal, так как там оценивается содержимое переменной, но мне любопытно. Может быть, есть способ создать что-то вроде макроса Си в Лиспе, или есть какой-то особый оператор case, который позволяет использовать только переменные вместо литералов.
Заранее спасибо!