Common Lisp:Hunchentoot:ASSOC 的奇怪行为

Common Lisp: Hunchentoot: Strange behavior with ASSOC

我正在使用这个 plist 作为数据结构:

SHALA-SYS> (pass-of (student-from-name "mozart reina"))
(:TYPE M :START-DATE @2015-01-03T15:29:25.000000+09:00 :AMT 17000)

并以此table为参考,匹配特定数值的类型:

(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 没有问题。

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

如果想使用符号作为数据结构的键,例如 属性-lists、assoc-lists、hash-tables、CLOS objects,...那么必须确保符号是 interned在正确的包装中。 cl:*package* 是当前包,这个变量可能有不同的值。例如,在程序的开发和运行期间,默认包的值可能不同。

使用 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