我使用这个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 对它没有问题。
答案 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