gpt4 book ai didi

lisp - 使用 hunchentoot 和 sbcl 从网络获取 lisp 输入时遇到问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:22 24 4
gpt4 key购买 nike

这里有一个口齿不清的问题。在过去的几个月里,我一直在慢慢学习 lisp,并且在尝试从 Web 浏览器获取输入与从 REPL 获取输入时遇到了问题。

具体问题是在尝试评估此代码时:

假设 sexp'(向北看)


(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 获取的请求参数时(汽车sexp)看起来无论我怎么看都一样,但在*allowed-commands*中找不到。

最佳答案

您需要确定您得到的输入是什么。它是一个符号吗? 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

关于lisp - 使用 hunchentoot 和 sbcl 从网络获取 lisp 输入时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6737684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com