这里有一个lisp问题。我在过去几个月里一直在慢慢学习lisp,并且在尝试从Web浏览器获取输入而不是从REPL获取输入时遇到了问题。
具体问题是在尝试评估此代码时:
假设sexp
为'(look north)
。
(member (car sexp) '(look walk pickup drop))
从SBCL的REPL中可以正常工作并且符合预期。但是,当从hunchentoot抓取sexp
时,即使sexp
“看起来像是与REPL相同,它似乎也无法考虑(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*
中找不到。
答案 0 :(得分:4)
您需要确定输入的内容。它是一个象征吗? Common Lisp具有TYPE-OF,INSPECT和DESCRIBE等函数,可以获取有关数据的更多信息。
* (describe 'north)
COMMON-LISP-USER::NORTH
[symbol]
* (type-of 'north)
SYMBOL
接下来的问题是:如果它是一个符号,它在哪个包中?
* (symbol-package 'north)
#<PACKAGE "COMMON-LISP-USER">
您的其他符号是否在同一个包中?
接下来的问题是:如果是符号或字符串,那么大写怎么样?
* (symbol-name 'north)
"NORTH"
默认情况下,符号为大写。对于从输入中读取的符号,情况并非如此。
现在你也可以使用MEMBER进行纯字符串比较:
* (member (symbol-name '|Foo|)
'(foo bar baz)
:key #'symbol-name :test #'equalp)
(FOO BAR BAZ) ; this is the usual return value,
; the rest list with first item found
答案 1 :(得分:1)
我从未使用过sbcl或Common Lisp,但这听起来像是一个实习问题。请尝试此查询:
(member (intern (car sexp)) '(look walk pickup drop)))