Вопрос о шутке здесь. За последние пару месяцев я медленно изучал lisp и столкнулся с проблемой, когда пытался получить ввод из веб-браузера вместо получения ввода из REPL.
Конкретная проблема заключается в попытке оценить этот код:
Предположим, sexp
равно '(look north)
.
(member (car sexp) '(look walk pickup drop))
Из REPL в SBCL это работает нормально и, как и ожидалось. Однако при извлечении sexp
из hunchentoot, даже если sexp
«выглядит» так же, как и из REPL, он никогда не сможет рассмотреть результат (car sexp)
члена '(look walk pickup drop)
.
Я думаю, что это может быть символьная кодировка файла и кодировка символов sexp
при получении из веб-браузера, но я не знаю, как проверить эту гипотезу. Любые указатели будут высоко оценены!
Редактировать
Способ ввода данных основан на текстовой приключенческой игре Конрада Барского «Земля Лиспа» и подробно описан ниже.
(defun game-read (string-to-read)
(let ((cmd (read-from-string
(concatenate 'string "(" string-to-read ")"))))
(describe cmd)
(flet ((quote-it (x)
(list 'quote x)))
(cons (car cmd) (mapcar #'quote-it (cdr cmd))))))
Это затем обернуто в:
(defun game-eval (sexp)
(if (member (car sexp) *allowed-commands*) ;Offending line
(eval sexp)
'(i do not know that command.)))
, где *allowed-commands*
:
(defparameter *allowed-commands* '(look walk pickup inventory))
Строка, помеченная мной как нарушающая, работает нормально, но когда string-to-read
из параметра запроса, полученного из hunchentoot как часть запроса (car sexp)
выглядит одинаково в любом случае Я знаю, как смотреть на это, но не найдено в *allowed-commands*
.