以下功能:
(defun check-for-arrow (x)
(format t "**~s**~s**~s**~s**"
(length (string x))
x
(eq x '->)
(and (eq (elt (string x) 0) #\-)
(eq (elt (string x) 1) #\>))) ; for debug
(eq x '->))
从REPL调用时,使用:
(check-for-arrow '->)
打印,带有跟踪:
0> Calling (CHECK-FOR-ARROW ->)
**2**->**T**T**
<0 CHECK-FOR-ARROW returned T
相反,当在Hunchentoot Web应用程序内部调用时,在表单中读取数据时,当通过符号“ - &gt;”调用时,打印:
0> Calling (NORMALIZER::CHECK-FOR-ARROW ->)
**2**->**NIL**T**
<0 NORMALIZER::CHECK-FOR-ARROW returned NIL
Lisp是Clozure Common Lisp。
这取决于不同的实习符号方式吗?可以在符号上使用'eq',或者我必须转换字符串中的箭头并检查字符串是否相等?
感谢。
答案 0 :(得分:6)
Common Lisp有包。包是符号的名称空间。
因此,可以有许多不同的符号命名为“ - &gt;”,每个符号都在不同的包中。
因此normalizer::->
不一定是EQ
到cl-user::->
。
符号也可以不包含在包中,因此可以有许多不同的同名符号而没有包。
CL-USER 2 > '#:->
#:->
CL-USER 3 > (describe *)
#:-> is a SYMBOL
NAME "->"
VALUE #<unbound value>
FUNCTION #<unbound function>
PLIST NIL
PACKAGE NIL
CL-USER 4 > '->
->
CL-USER 5 > (describe *)
-> is a SYMBOL
NAME "->"
VALUE #<unbound value>
FUNCTION #<unbound function>
PLIST NIL
典型问题:
一个函数可以测试具有特定符号FOO
的事物的EQ。用户输入FOO
。
但是你的Lisp函数如何将用户输入转换为符号?符号在哪个包中?记住符号因名称和包而异。如果未指定包,则默认值为变量CL:*PACKAGE*
的值。但是这个变量在不同的时间可以有不同的值。
只需扩展您的测试功能即可打印符号包,您将看到不同之处。
CL-USER 7 > (package-name (symbol-package '->))
"COMMON-LISP-USER"