2014-01-27 55 views
3

以下功能:Common Lisp的平等在Web應用程序

(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網絡應用程序中調用時,在表單中讀取數據時,在符號' - >'上調用時,將打印:

0> Calling (NORMALIZER::CHECK-FOR-ARROW ->) 
**2**->**NIL**T** 
<0 NORMALIZER::CHECK-FOR-ARROW returned NIL 

Lisp是Clozure Common Lisp。

這是否依賴於實習符號的不同方式?可以在符號上使用'eq',或者我必須轉換字符串中的箭頭並檢查字符串是否相等?

謝謝。

+0

注意:類似' - >'是一個符號和一個原子。 atom這個詞與剛纔的符號有不同的含義。所有不是缺陷的細胞都是原子。因此數字'3',字符串''foo'',矢量'#(1 2 3)',...都是原子 - 但它們不是符號。 –

回答

6

Common Lisp有軟件包。包是符號的一種命名空間。

因此,可以有許多名爲「 - >」的不同符號,每個符號都在不同的包中。因此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" 
+0

非常感謝,我需要這個澄清!我可以看到' - >爲web應用程序的包是「COMMON-LISP-USER」,而' - >是寫在函數中的是「NORMALIZER」。順便說一下,有一種簡單的方法只檢查符號的「名稱」部分? – Renzo

+0

回答我以前的問題,我認爲執行此測試的「最佳」方式是:'(string =(symbol-name x)(symbol-name' - >))''。 – Renzo

+1

@renzo:比'symbol-name'更短的函數是'string'。 –