Lisp 通用口齿不清:Hunchentoot:与ASSOC的奇怪行为

Lisp 通用口齿不清:Hunchentoot:与ASSOC的奇怪行为,lisp,common-lisp,symbols,Lisp,Common Lisp,Symbols,我将此plist用作数据结构: SHALA-SYS> (pass-of (student-from-name "mozart reina")) (:TYPE M :START-DATE @2015-01-03T15:29:25.000000+09:00 :AMT 17000) 并使用此表作为参考,以匹配具有特定数值的类型: (defparameter *type-map* '((M . 30) (E . 30)

我将此plist用作数据结构:

SHALA-SYS> (pass-of (student-from-name "mozart reina"))
(:TYPE M :START-DATE @2015-01-03T15:29:25.000000+09:00 :AMT 17000)
并使用此表作为参考,以匹配具有特定数值的类型:

(defparameter *type-map* '((M . 30)
                           (E . 30)
                           (W . 7)))
因此,在REPL中使用
assoc
,工作正常:

SHALA-SYS> (assoc (getf (pass-of (student-from-name "mozart reina"))
                        :type)
                  *type-map*)
(M . 30)
但是当我在Hunchentoot中运行完全相同的代码时,我得到了nil

(define-easy-handler (dummy-fn :uri "/dummy-fn") ()
  (standard-page (:title "")
    (htm
       (fmt "~A" (assoc (getf (pass-of (student-from-name "mozart reina"))
                              :type)
                        *type-map*)))))

NIL

有人有过这种经历吗?我能想到的唯一一件事是MongoDB,我用来持久化数据的,不知怎么搞的,在某种程度上破坏了符号,因为它将它们保存为字符串,但我在它们上运行intern,将它们转换回符号,而且REPL没有问题。

这是一个常见问题解答:使用符号作为键似乎不起作用

如果想要使用符号作为数据结构的键,比如属性列表、assoc列表、哈希表、CLOS对象等等。。。然后,我们必须确保这些符号在正确的包装中<代码>cl:*包*是当前包,此变量可能有不同的值。例如,在程序开发和运行期间,默认包的值可能不同

使用
CL:INTERN
时,将包作为参数或绑定
CL:*package*
变量非常有用

CL-USER 10 > (intern "FOO")
FOO
NIL

CL-USER 11 > (symbol-package *)
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external>

CL-USER 12 > (INTERN "FOO" "HTTP-USER")
HTTP-USER::FOO
NIL

CL-USER 13 > (let ((*package* (find-package "HTTP-USER")))
               (intern "FOO"))
HTTP-USER::FOO
:INTERNAL
CL-USER 10>(实习“FOO”)
福
无
CL-USER 11>(符号包*)
#
CL-USER 12>(实习生“FOO”HTTP-USER)
HTTP-USER::FOO
无
CL-USER 13>(let((*package*(查找包“HTTP-USER”))
(实习医生“FOO”))
HTTP-USER::FOO
:内部

你在哪个软件包中实习符号?哈,我刚刚发现我一定是在#:cl user中实习符号,而不是在项目包中实习符号。。。明确指定包解决了这个问题,谢谢。在使用MongoDB之前,我使用一个简单的全局列表作为数据库进行原型设计,所以这就是为什么从来没有出现过,不需要插入符号。在这种情况下,使用什么作为键更好?串?我选择使用符号,因为它们是CL的一个组成部分,处理它们的函数似乎比等效的字符串函数更“原生”。@momo:使用符号是可以的。但是,在处理不受控制的输入时,请考虑以下含义:程序可能会生成大量符号,因为它从输入中读取符号-确保未使用的符号实际上是垃圾收集的。。。