リトルスキーマーのeqlist?機能 - 代替バージョン?
-
24-09-2019 - |
質問
私は「リトルスキーマー」の本を経て、様々な機能をやっています。一般的に私は2つのリストの平等をテストするための関数である?,なくeqlistため、書籍と同じバージョンで終わるます。
私は私のバージョンをテストしてみた、それは私がそれで投げる何かを渡します。しかし、それは「リトル・スキーマー」バージョンとは少し違う、と私は何かが欠けてるかどうかで誰かの意見が欲しい - 。私はそれはケースだ疑い。
私のバージョン:
(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)))))
ありがとうございます!
ジョス・ドラージュ
解決
(1 2 . 3)
のようなものなリストではありませんペア)に渡された場合は、書籍版は壊れます。 (注それは当然のことながら、'()
で仕事をする - TLSは、これが原子またはないことを考えていないことを確認場合。)これはあなたの関数は実際にはより強固になり、しかしおそらくより良いeqv?
よりequal?
/ eqlist?
命名します。 (私はequal?
が数値平等をテストするためにeqan?
に使用されますが、伝統的にこの名前は機能をテストする普遍的な価値の平等に装着されている参照してください。)
基本的に、あなたのeqlist?
は、(1)atom?
が非ペアからペア(car
とcdr
で物事を)伝えることができることを仮定の下での引数のいずれかのタイプで動作し、(2)pair?
(それはeqan?
の否定バージョンです)原子の平等をテストし、(3)すべてがいずれか'()
又は対又は原子です。 (まあ、実際に'()
が私の目には原子である - 。プチシェスキームが同意)書籍版は、('()
含む)適切なリスト上で動作し、同様の仮定およびでは無視不適切なリストに遭遇する可能性を作る
より堅牢な平等のテスト機能は本の中で、後に提示された場合、私は驚かないだろうが、私は確認することが可能な必要はありません。とにかく、あなたが投稿eqlist?
の書籍版は、あなたが実際に日々のプログラミングで使用したいと思い何か、リストの背後にある基本的な考え方ではなく例示することを意味何かのように思えます。実際には、eqan?
の特定のバージョンは、このように上述した第2段落に記載されている仮定を無効にする、非常に少なくとも、文字列は別個に会計処理する必要があるであろう、その中に考慮すべきデータのより多くの原子の種類は、あります制限のない環境で破ると、 eqlist?
の両方のバージョンを壊します。
他のヒント
ここでの私のバージョンがあります:
(define eqlist?
(lambda (l1 l2)
(cond
((and (null? l1) (null? l2))
#t)
((and (atom? (car l1)) (atom? (car l2)))
(and (eq? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2))))
(else
(and (eqlist? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2)))))))