这里有一个口齿不清的问题。在过去的几个月里,我一直在慢慢学习 lisp,并且在尝试从 Web 浏览器获取输入与从 REPL 获取输入时遇到了问题。
具体问题是在尝试评估此代码时:
假设sexp
是'(look north)
。
(member (car sexp) '(look walk pickup drop))
从 SBCL 中的 REPL 来看,这可以正常工作并且符合预期。但是,当sexp
从 hunchentoot 中获取时,即使“看起来”与 REPL 中的相同,sexp
它似乎永远无法考虑(car sexp)
.'(look walk pickup drop)
我认为这可能是文件的字符编码与sexp
从网络浏览器抓取时的字符编码,但我不知道如何检验这个假设。任何指针将不胜感激!
编辑
我输入的方式是基于 Conrad Barski 的“Land of Lisp”中的文字冒险游戏,详情如下。
(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*
.