ماذا يحدث في البند مخطط "كوند 'عندما' آخر 'تم حذف؟

StackOverflow https://stackoverflow.com/questions/813587

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا في عملية التعلم مخطط. قضيت مؤخرا (أكثر من اللازم!) الوقت في محاولة لإيجاد خلل في البرنامج قبل أدركت أنني في عداد المفقودين كلمة "شيء آخر" في فقرة كوند. ولكن المشكلة في مثل هذه الظروف يبدو غريبا بعض الشيء. تجارب مع الظروف فقط مع برنامج بسيط (أدناه) في 'مهما' يحصل على عرض كما هو متوقع في بند آخر، ولكن أيضا يحصل على عرض، ولكن من دون 'آخر'، ويحصل على عرض مع التنصيص المحيطة والجديد تفسير برنامج الأمم المتحدة لل خط طباعة حرفيا. أي شخص يمكن أن يفسر لي ما الذي يحدث؟ TIA.

   (define (foo x)
    (cond ((eq? x 0) (display "zero\n"))
          (display "whatever\n")))

   (define (bar x)
    (cond ((eq? x 0 ) (display "zero\n"))
          (else (display "whatever\n"))))

In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
> 
هل كانت مفيدة؟

المحلول

و"آخر" هو مجرد مرادف ل "صحيح". الطريق إلى قراءة كوند هي على شكل سلسلة من الاختبارات، حيث أول اختبار هذا صحيح يسبب هذا الشكل ليتم تقييمها.

(cond  ( (test) (do this) )
       ( (test) (do this) ) )

وهنا واحد الأول

 (cond ((eq? x 0) (display "zero\n"))
        (display "whatever\n")))

وكوند ينظر (eq? x 0) وتحديد هذا كاذبة. البند التالي هو (display "whatever\n"). يبدو في display، ونظرا لعدم display nil، هذا صحيح. ومن ثم يقيم "whatever\n" السلسلة، والذي يقيم ببساطة لنفسها. وبالتالي فإن قيمة كوند هي ثم "whatever\n".

والآن، ها أنت ثانية واحدة:

(cond ((eq? x 0 ) (display "zero\n"))
       (else (display "whatever\n"))))

وهنا، فإن الاختبار الأول غير صحيح، وأنه يذهب إلى المرحلة الثانية، وهي else والذي يقوم بتقييم إلى true. (إذا كنت تفكر في ذلك، وهذا ما "آخر" يعني في وضعها الطبيعي إذا، ثم بين آخر: "صحيح لجميع الحالات التي لم تكن أي من الاختبارات السابقة صحيحا")

والآن، النموذج التالي هو (display "whatever\n"). هذا هو وظيفة أن يرسل سيطة سلسلة إلى وحدة التحكم وإرجاع أي شيء لأن هذا هو ما يحدث عرض للقيام به. في مخطط آخر، فإنه قد يعود قيمة السلسلة، وكذلك طباعته، وفي هذه الحالة كنت انظر

whatever
"whatever\n"

نصائح أخرى

في وظيفة foo، وبيان cond يقيم display كشرط لاختبار. لأنه ليس هناك في الواقع رمزا دعا display، فالتقييم إلى true، حتى ذلك الحين يتم تقييم "whatever\n" نتيجة (foo 2).

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