2013-08-17 44 views
1

如果使用equal?比較兩個符號,我會得到不同的結果,具體取決於其中一個符號來自列表而另一個不符合。如何比較符號與列表中的符號

下面展示了這種:

; The following returns #t 
(equal? (list-ref '('a 'b) 1) (list-ref '('a 'b) 1)) 

; But this return #f 
(equal? 'b (list-ref '('a 'b) 1)) 

什麼是比較兩個符號的最佳方式當一個是從列表中有一個沒有了?如果你能幫助我理解爲什麼會出現這種情況,那就更好了。

回答

5

你不是比較符號:

> (list-ref '('a 'b) 1) 
''b 
> (symbol? (list-ref '('a 'b) 1)) 
#f 

由於雙引號:

> (list-ref '(a b) 1) 
'b 
> (symbol? (list-ref '(a b) 1)) 
#t 

所以您最初的情況下變得

> (equal? 'b (list-ref '(a b) 1)) 
#t 

如果列表中只包含符號,它是更常見的使用eq?對它們進行比較(它應該會更快):

> (eq? 'b (list-ref '(a b) 1)) 
#t 

如果你用雙引號,因爲你的列表可以包含其他類型,然後使用

> (list 'a 'b) 
'(a b) 

代替

> '(a b) 
'(a b) 
+0

早期,引用的列表可能會造成混淆。與此同時,在克里斯的例子中,你很少會用'list'出錯,你更可能寫出你的意思。 –