使用hunchentoot和sbcl从网络抓取lisp输入时遇到麻烦

时间:2011-07-18 18:40:02

标签: lisp sbcl hunchentoot

这里有一个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*中找不到。

2 个答案:

答案 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)))