リストはアトムではありません。ここが重要な部分です。シンボルはアトムですが、つまり、それらが同じ場合、それらは同じメモリに常駐し、数値に似ており、実際にはポインターとして見ることができます。シンボルも可変ではありません。シンボルfoo
は数値のようなもの3
です。
ただし、リストはアトム、2 つのリスト、または文字列ではありません。同じ内容を持つベクトルの 2 つの異なる場所に非常によく常駐できます。
eq?
メモリの場所のみをテストします。eqv?
それが何であるかはあいまいであり、実装に依存します.Scheme標準はこれに対してかなり寛大です.少なくともeq?
基本的にのスーパーセットでなければならないと言っているだけです. equal?
一方、構造的等価性をテストし、再帰的にテストするため、非常にコストのかかる操作であり、識別子として文字列よりもシンボルが好まれることが多いのはそのためです。
(define l1 (list 1 2 3))
(define l2 (list 1 2 3))
(eq? l1 l2) ; ===> #f in most implementations
(equal? l1 l2) ; ===> #t in all implementations
(eqv? l1 l2) ; ===> #t in some implementations
(define l3 (cdr l1))
(define l4 (cdr l1))
(eq? l3 l4) ; ===> #t, this means that they 'share memory', if you change l3 or l4, l1 will change with it, beware. This is how car and cdr work, they do not copy.
(define l6 (cons 1 l4));
(eq? l1 l6) ; ===> #f again, cons does allocate new memory, but the tails may very well share it, s in this case, l6 does share its tail with all lists except l2 here in memory.
また、ちょっとした用語です。cons はペアを作成します。これは 2 つの要素のリストとは異なります。ペアを作成します(a . b)
。リスト(a b)
は実際にはペアと同じです。(a . (b . ()))
また、cons と car と cdr はプリミティブです。以下に示す実装は、コンピュータ プログラムの構造と実装のデモンストレーションであり、それらは厳密には必要ないことを示していますが、それらをプリミティブとして使用するとパフォーマンスが劇的に向上します。 cons、car、および cdr を定義します。