Common Lisp:Hunchentoot:ASSOC的奇怪行为

时间:2015-01-03 08:16:17

标签: 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)
                           (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,不知何故搞砸了符号,因为它将它们保存为字符串,但我对它们运行实习生将它们转回符号, REPL 对它没有问题。

1 个答案:

答案 0 :(得分:3)

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

如果想要使用符号作为数据结构的键,如属性列表,关联列表,哈希表,CLOS对象,......那么必须确保符号在正确的包中实现。 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