سؤال

لقد واجهت هذا الرمز على ويكيبيديا:

(define (pyth x y k)
    (* x x (lambda (x2)
        (* y y (lambda (y2)
            (+ x2 y2 (lambda (x2py2)
                (sqrt x2py2 k))))))))

تقول المقالة أن هذا الرمز هو إصدار استمرار المرور لجزء آخر من التعليمات البرمجية:

(define (pyth x y)
    (sqrt (+ (* x x) (* y y))))

ومع ذلك فأنا في حيرة من أمري:كيف يعمل ذلك حتى؟كيف تضرب رقمًا في لامدا هنا؟ (* x x (lambda ...))

هل كانت مفيدة؟

المحلول

في مثال ويكيبيديا، * لا يعني نفس الشيء * في المثال التقليدي.

سأعيد كتابة مثال ويكيبيديا على النحو التالي:

(define (pyth x y k)
    (cps-* x x (lambda (x2)
        (cps-* y y (lambda (y2)
            (cps-+ x2 y2 (lambda (x2py2)
                (cps-sqrt x2py2 k))))))))

وفي هذا الشكل كل من cps-xxx تقوم الوظائف بتنفيذ العملية المشار إليها ثم تمرير النتيجة إلى الوسيطة الأخيرة.يمكنك تسميتها هكذا:

(pyth 2 3 display)

الذي سيضرب 2 و 3، ويعطي 6، ثم يمرر 6 إلى display.(في الواقع قد ترغب في تمرير النتيجة إلى ملف cps-display التي عرضت وسيطتها (وسيطاتها) الأولية ثم تم استدعاؤها آخر الوظيفة المحددة كمعلمة أخيرة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top