1

を使用して 2 つのシンボルを比較するequal?と、シンボルの 1 つがリストからのもので、もう 1 つがそうでないかによって、異なる結果が得られます。

これを以下に示します。

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

リストからのものとリストからのものではない場合、2 つのシンボルを比較する最良の方法は何ですか? なぜこれが当てはまるのかを理解するのを手伝ってもらえれば、さらに良いでしょう。

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 に答える