web应用中符号的公共Lisp等式
以下功能:web应用中符号的公共Lisp等式,lisp,common-lisp,equality,symbols,hunchentoot,Lisp,Common Lisp,Equality,Symbols,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 '->)
(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
0>呼叫(检查箭头->)
**2**->**T**T**
调用(NORMALIZER::CHECK-FOR-ARROW->)
**2**->**零**T**
CommonLisp有多个包。包是一种用于符号的名称空间
因此,可以有许多名为“->”的不同符号,每个符号位于不同的包中
因此,normalizer::->
不一定是EQ
到cl用户::->
符号也可以不固定在一个包中,因此一个包可以有许多相同名称的不同符号,而没有一个包
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
注意:类似于->
的东西是一个符号和一个原子。原子一词的含义与符号不同。一切不是细胞的东西都是原子。因此,数字3
,字符串“foo”
,向量#(13)
。。。都是原子,但它们不是符号。非常感谢,我需要这个澄清!我可以看到,web应用程序的'->包是“COMMON-LISP-USER”,而函数中编写的'->包是“NORMALIZER”。顺便说一句,有一种简单的方法可以只检查符号的“名称”部分?回答我前面的问题,我认为执行此测试的“最佳”方法是:(string=(符号名称x)(符号名称“->)
@renzo:symbol name
比更短的函数是string
@renzo:string=如果您愿意的话,它恰好愿意直接比较符号名(它使用包含符号的“字符串指示符”)。我认为我最倾向于围绕第二个符号的读取绑定*package*,如果在代码中这样做方便的话,可以使用eq。
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
CL-USER 7 > (package-name (symbol-package '->))
"COMMON-LISP-USER"