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