سؤال

سأمر عبر كتاب "Schemer" ، وأقوم بالوظائف المختلفة. بشكل عام ، انتهى بي الأمر بنفس الإصدار مثل الكتب ، ولكن ليس لـ eqlist؟ ، ما هي الدالة لاختبار مساواة قائمتين.

لقد حاولت اختبار روايتي ويمرر أي شيء أرميه. ومع ذلك ، فإن الأمر يختلف قليلاً عن إصدار "Schemer 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)))))))

وفي كلتا الحالتين ، فإن تعريف إكان هو:

(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) من غير الأزواج (إنها النسخة المنقولة من pair?), (2) eqan? يختبر مساواة الذرات ، (3) كل شيء أيضًا '() أو زوج أو ذرة. (حسنا ، في الواقع '() هي ذرة في عيني - وتوافق مخطط Petite Chez.) نسخة الكتاب تعمل على القوائم المناسبة (بما في ذلك '()) ، يجعل افتراضات مماثلة وتجاهل إمكانية مواجهة قائمة غير لائقة.

لن أتفاجأ إذا تم تقديم وظيفة اختبار المساواة الأكثر قوة في وقت لاحق في الكتاب ، لكنني لا أتوفر للتحقق منها. على أي حال ، نسخة كتاب من eqlist? يبدو أنك تم نشره وكأنه شيء يهدف إلى توضيح الأفكار الأساسية وراء القوائم ، وليس شيئًا تريد استخدامه بالفعل في البرمجة اليومية. في الواقع ، النسخة المعطاة من eqan? من شأنه أن يكسر بيئة غير مقيدة حيث يوجد المزيد من أنواع البيانات الذرية التي يجب مراعاتها ، من بينها على الأقل ، يجب حساب الأوتار 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)))))))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top