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

Law*_*man 1 racket

如果我使用I比较两个符号,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))
Run Code Online (Sandbox Code Playgroud)

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

use*_*lpa 6

你没有比较符号:

> (list-ref '('a 'b) 1)
''b
> (symbol? (list-ref '('a 'b) 1))
#f
Run Code Online (Sandbox Code Playgroud)

由于双引号:

> (list-ref '(a b) 1)
'b
> (symbol? (list-ref '(a b) 1))
#t
Run Code Online (Sandbox Code Playgroud)

所以你最初的情况变成了

> (equal? 'b (list-ref '(a b) 1))
#t
Run Code Online (Sandbox Code Playgroud)

如果您的列表只包含符号,那么使用eq更常见吗?比较它们(它应该更快):

> (eq? 'b (list-ref '(a b) 1))
#t
Run Code Online (Sandbox Code Playgroud)

如果您双引号,因为您的列表可能包含其他类型,请使用

> (list 'a 'b)
'(a b)
Run Code Online (Sandbox Code Playgroud)

代替

> '(a b)
'(a b)
Run Code Online (Sandbox Code Playgroud)