Little Schemer Eqlist؟ وظيفة - نسخة بديلة؟
-
24-09-2019 - |
سؤال
سأمر عبر كتاب "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)))))))