Web应用程序中符号上的Common Lisp相等

时间:2014-01-27 06:59:17

标签: 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 '->))

从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',或者我必须转换字符串中的箭头并检查字符串是否相等?

感谢。

1 个答案:

答案 0 :(得分:6)

Common Lisp有包。包是符号的名称空间。

因此,可以有许多不同的符号命名为“ - &gt;”,每个符号都在不同的包中。

因此normalizer::->不一定是EQcl-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"