如何将符号与从列表中获取的符号进行比较

时间:2013-08-17 06:44:12

标签: racket

如果我使用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))

当一个符号来自列表而另一个符号不是时,比较两个符号的最佳方法是什么?如果你能帮我理解为什么会这样,那就更好了。

1 个答案:

答案 0 :(得分: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)