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))

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

4

1 回答 1

6

你不是在比较符号:

> (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)
于 2013-08-17T08:07:59.690 回答