سؤال

أنا مجرد بداية للعمل من خلال SICP (على بلدي ، هذا ليس لفئة), و لقد كنت تناضل مع ممارسة 1.6 لبضعة أيام وأنا فقط لا يمكن أن يبدو لمعرفة ذلك.هذا هو واحد حيث أليسا إعادة تعريف if حيث cond, مثل:

(define (new-if predicate then-clause else-clause)
    (cond (predicate then-clause)
          (else else-clause))

كانت الاختبارات بنجاح في بعض الحالات البسيطة ، ومن ثم يستخدم لإعادة كتابة الجذر التربيعي برنامج (التي عملت على ما يرام مع if):

(define (sqrt-iter guess x)
    (new-if (good-enough? guess x)
            guess
            (sqrt-iter (improve guess x)
                       x)))

السؤال ثم يسأل:"ماذا يحدث عندما أليسا محاولات لاستخدام هذا لحساب مربع جذور ؟ شرح." [إذا لزم الأمر, أنا سعيد أن إنتاج إجراءات أخرى (good-enough?, improve, ، الخ) ، فقط اسمحوا لي أن أعرف.]

الآن أنا أعرف ما يحدث:لم بإرجاع قيمة ، وهو ما يعني أن البرنامج recurses بلا حدود.أنا فقط لا يمكن أن يفسر لماذا يحدث هذا.مهما كانت خفية يوجد فرق بين if و new-if هو التملص مني.أي مساعدة محل تقدير كبير.

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

المحلول

new-if هي وظيفة. عندما يتم استدعاء وظيفة، ما هو أول ما يفعله المخطط مع قائمة الوساطة؟ يقيم الكل الحجج.

نصائح أخرى

new-if هو إجراء، ويستخدم المخطط تقييم الطلب المتقدبي (1.1.5)، لذلك حتى من قبل new-if يتم تنفيذها بالفعل، عليها تقييم جميع الحجج أولا، والتي هي guess و (sqrt-iter (improve guess x) x). وبعد يمكنك أن ترى أن الحجة الأخيرة هي العودية، والتي تستدعي جديد new-if الإجراء، هذه هي الطريقة التي تحدث الحلقة اللانهائية.

العادي if لا تحتاج إلى تقييم حججها أولا، فقط تذهب على طول الطريق، وهذا هو الفرق بين if و new-if. :)

بادئ ذي بدء فهم الفرق بين تقييم النظام الأمامي والنظام الطبيعي. يستخدم LISP طلبا متطورا، لكن التعبيرات الشرطية يتم تقييمها وليس مثل الوظائف العادية (SICP الفصل 1.1.6.):

(if <predicate> <consequent> <alternative>)

لتقييم التعبير IF، يبدأ مترجم الترجمة من خلال تقييم <predicate> جزء من التعبير. إذا كان <predicate> يقيم إلى قيمة حقيقية، ثم يقوم المترجم الخاص بتقييم <consequent> وإرجاع قيمتها. وإلا فإنه يقيم <alternative> وإرجاع قيمتها.

Ex1.6.الجديدة-إذا كان:

(define (new-if predicate then-clause else-clause)
     (cond (predicate then-clause)
                (else else-clause)))

الفرق مع 'إذا-البيانات:إذا كشوف تقييم واحد من المسند -> يترتب على ذلك -> بديل ،

ولكن الجديد-إذا كان قد لتقييم جميع المعلمات الملقب الحجج لحظة ما يسمى(الذي يعني 'آخر-شرط' يقيم في البداية!!),

وبالتالي هذا يسبب حلقة لانهائية عند أي من هذه المعايير يسمون أنفسهم في حلقة تكرارية

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