8

「Little Schemer」の本を読んで、さまざまな機能を実行しています。通常、本と同じバージョンになりますが、2 つのリストの等価性をテストする関数である eqlist? についてはそうではありません。

私は自分のバージョンをテストしようとしましたが、私が投げたものは何でも通過します。それでも、「Little Schemer」バージョンとは少し異なります。また、何かが欠けているかどうかについて誰かの意見が欲しいです。

私のバージョン:

(define eqlist?
  (lambda (list1 list2)
    (cond
      ((and (null? list1)(null? list2))#t)
      ((or (null? list1)(null? list2))#f)
      ((and (atom? list1)(atom? list2))(eqan? list1 list2))
      ((or (atom? list1)(atom? list2)) #f)
      (else
        (and(eqlist? (car list1) (car list2))
            (eqlist? (cdr list1) (cdr list2)))))))

本のバージョン:

(define eqlist2? ;This is Little Schemer's version
  (lambda (list1 list2)
    (cond
      ((and (null? list1)(null? list2)) #t)
      ((or (null? list1)(null? list2)) #f)
      ((and (atom? (car list1))(atom? (car list2)))
       (and (eqan? (car list1)(car list2))(eqlist2? (cdr list1)(cdr list2))))
      ((or (atom? (car list1))(atom? (car list2))) #f)
      (else
       (and (eqlist2? (car list1)(car list2))
            (eqlist2? (cdr list1)(cdr list2)))))))

どちらの場合も、eqan の定義は次のとおりです。

(define eqan?
  (lambda (a1 a2)
    (cond
      ((and (number? a1)(number? a2)) (equal? a1 a2))
      ((or (number? a1)(number? a2)) #f)
      (else (eq? a1 a2)))))

ありがとうございました!

ジョス・ドラージ

4

2 に答える 2

6

アトムまたは不適切なリスト (リストではないペア -- のようなもの(1 2 . 3)) を引数として渡すと、ブック バージョンが壊れます。(もちろん、 で動作することに注意してください'()。TLS がこれをアトムと見なすかどうかは不明です。) これにより、実際には関数がより堅牢になりますが、eqv?/equal?よりも適切な名前が付けられる可能性がありますeqlist?。(数値の等価性をテストするためequal?に使用されているeqan?ようですが、伝統的にこの名前は普遍的な値の等価性テスト関数に付けられています。)

基本的に、eqlist?(1)ペア (とを持つもの) を非ペア ( の否定バージョン) からatom?区別できる、(2)アトムの等価性をテストする、(3)すべてがペアまたは原子のいずれかです。(まあ、実際には私の目にはアトムです -- そして Petite Chez Scheme も同意します。) 書籍版は適切なリスト ( を含む) で機能し、同様の仮定を行い、不適切なリストに遭遇する可能性を無視します。carcdrpair?eqan?'()'()'()

本書の後半で、より堅牢な等価性テスト関数が提示されたとしても、私は驚かないでしょうが、それを確認することはできません。とにかく、eqlist?あなたが投稿した本のバージョンは、リストの背後にある基本的なアイデアを説明するためのもののようであり、日常のプログラミングで実際に使用したいものではありません. 実際、指定されたバージョンのeqan?は、考慮すべきデータのアトミック タイプがより多く存在する制限のない環境では機能しなくなります。その中で、少なくとも文字列を個別に考慮する必要があるため、上記の 2 番目の段落に記載されている仮定が無効になり、機能が壊れます。の両方のバージョンeqlist?

于 2010-03-04T13:55:43.980 に答える