使用hunchentoot和sbcl从web获取lisp输入时遇到问题
这里有一个口齿不清的问题。在过去的几个月里,我一直在慢慢学习lisp,在尝试从web浏览器获取输入与从REPL获取输入时遇到了一个问题 具体问题是在尝试评估此代码时: 假设使用hunchentoot和sbcl从web获取lisp输入时遇到问题,lisp,sbcl,hunchentoot,Lisp,Sbcl,Hunchentoot,这里有一个口齿不清的问题。在过去的几个月里,我一直在慢慢学习lisp,在尝试从web浏览器获取输入与从REPL获取输入时遇到了一个问题 具体问题是在尝试评估此代码时: 假设sexp是”(向北看) (成员(汽车sexp)’(看-走-下车) 从SBCL中的REPL来看,这工作正常,正如预期的那样。然而,当从HuncTunoOT中获取 EXP> ,尽管 EXP >“看起来”与RePL相同,但似乎永远不能考虑(Cou-EXP)< > >(Skad Fipe Poad Load)< < /C> >
sexp
是”(向北看)
(成员(汽车sexp)’(看-走-下车)
从SBCL中的REPL来看,这工作正常,正如预期的那样。然而,当从HuncTunoOT中获取<代码> EXP> <代码>,尽管sexp
的字符编码,但我不知道如何验证这一假设。任何指点都将不胜感激
编辑
我输入的方式是基于康拉德·巴尔斯基的《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.)))
其中,*允许的命令*
是:
(defparameter *allowed-commands* '(look walk pickup inventory))
我标记为冒犯的行正常工作正常,但当要读取的
字符串是作为请求的一部分从hunchentoot获取的请求参数时(car sexp)
在任何方面看起来都是一样的,我知道如何看待它,但在*允许的命令中找不到它*
我从未使用过sbcl或Common Lisp,但这听起来像是一个实习问题。请改为尝试此查询:
(member (intern (car sexp)) '(look walk pickup drop)))
我从未使用过sbcl或Common Lisp,但这听起来像是实习中的问题。请改为尝试此查询:
(member (intern (car sexp)) '(look walk pickup drop)))
你需要确定你得到的是什么输入。它是一种象征吗?CommonLisp具有TYPE-OF、INSPECT和description等功能,可以获取更多数据信息
* (describe 'north)
COMMON-LISP-USER::NORTH
[symbol]
* (type-of 'north)
SYMBOL
下一个问题是:如果它是一个符号,它在哪个包中
* (symbol-package 'north)
#<PACKAGE "COMMON-LISP-USER">
默认情况下,符号为大写。对于从输入读取的符号,情况不一定如此
现在,您还可以使用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
你需要确定你得到的是什么输入。它是一种象征吗?CommonLisp具有TYPE-OF、INSPECT和description等功能,可以获取更多数据信息
* (describe 'north)
COMMON-LISP-USER::NORTH
[symbol]
* (type-of 'north)
SYMBOL
下一个问题是:如果它是一个符号,它在哪个包中
* (symbol-package 'north)
#<PACKAGE "COMMON-LISP-USER">
默认情况下,符号为大写。对于从输入读取的符号,情况不一定如此
现在,您还可以使用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
你应该展示你是如何“抓住”输入的。你是对的!更正!你应该展示你是如何“抓住”输入的。你是对的!更正!谢谢这很方便!不幸的是,描述
,类型的
和检查
函数都给出相同的输出。。。使用descripe
我得到一个列表作为类型和类型的CONS,我认为这是预期的。奇怪的是,在我的游戏评估
函数中,当我的成员
函数关键参数:test
是值#“string-equal
时,它确实在*允许的命令*
中找到了成员!但是它没有找到函数,表示函数LOOK
未定义。快到了!我知道是什么了。事实证明,lisp阅读器不仅是一个包装问题,也是一个让我扫兴的问题。选择这一个作为正确答案,因为它允许我查看所有东西的外观和位置。谢谢!这很方便!不幸的是,描述
,类型的
和检查
函数都给出相同的输出。。。使用descripe
我得到一个列表作为类型和类型的CONS,我认为这是预期的。奇怪的是,在我的游戏评估
函数中,当我的成员
函数关键参数:test
是值#“string-equal
时,它确实在*允许的命令*
中找到了成员!但是它没有找到函数,表示函数LOOK
未定义。快到了!我知道是什么了。事实证明,lisp阅读器不仅是一个包装问题,也是一个让我扫兴的问题。选择这一个作为正确答案,因为它允许我检查所有东西的外观和位置。