如果我使用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))
当一个符号来自列表而另一个符号不是时,比较两个符号的最佳方法是什么?如果你能帮我理解为什么会这样,那就更好了。
答案 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)