Ren*_*nzo 3 lisp symbols equality common-lisp hunchentoot
以下功能:
(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 '->))
Run Code Online (Sandbox Code Playgroud)
从REPL调用时,用:
(check-for-arrow '->)
Run Code Online (Sandbox Code Playgroud)
打印,跟踪:
0> Calling (CHECK-FOR-ARROW ->)
**2**->**T**T**
<0 CHECK-FOR-ARROW returned T
Run Code Online (Sandbox Code Playgroud)
相反,当在Hunchentoot Web应用程序内部调用时,在表单中读取数据时,通过符号" - >"调用时,将打印:
0> Calling (NORMALIZER::CHECK-FOR-ARROW ->)
**2**->**NIL**T**
<0 NORMALIZER::CHECK-FOR-ARROW returned NIL
Run Code Online (Sandbox Code Playgroud)
Lisp是Clozure Common Lisp.
这取决于不同的实习符号方式吗?可以在符号上使用'eq',或者我必须转换字符串中的箭头并检查字符串是否相等?
谢谢.
Common Lisp有包.包是符号的名称空间.
因此,可以有许多不同的符号命名为" - >",每个符号都在不同的包中.
因此,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
Run Code Online (Sandbox Code Playgroud)
一个典型的问题:
一个函数可以测试某个符号的EQ FOO.用户输入FOO.
但是你的Lisp函数如何将用户输入转换为符号?符号在哪个包中?记住符号因名称和包而异.如果未指定包,则默认值为变量的值CL:*PACKAGE*.但是这个变量在不同的时间可以有不同的值.
只需扩展您的测试功能即可打印符号包,您将看到不同之处.
CL-USER 7 > (package-name (symbol-package '->))
"COMMON-LISP-USER"
Run Code Online (Sandbox Code Playgroud)