Racket 如何将符号与列表中的符号进行比较

Racket 如何将符号与列表中的符号进行比较,racket,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)) 当一个符号来自列表而另一个不来自列表时,比较两个符号的最佳方法是什么?如果您能帮助我理解为什么会出现这种情况,那就

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

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

您没有比较符号:

> (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更常见?要比较它们(应该更快):

如果由于列表可能包含其他类型而双引号,则使用

> (list 'a 'b)
'(a b)
而不是

> '(a b)
'(a b)

你不是在比较符号:

> (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更常见?要比较它们(应该更快):

如果由于列表可能包含其他类型而双引号,则使用

> (list 'a 'b)
'(a b)
而不是

> '(a b)
'(a b)

在早期,引用的列表可能会令人困惑。同时,使用
list
很少出错,就像Chris的例子一样,你更可能写出你的意思。早期,引用列表可能会让人困惑。同时,使用
list
很少出错,就像Chris的例子一样,你更有可能写出你的意思。