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
我正在使用这个 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