2009-05-01 12 views
8

मैं योजना सीखने की प्रक्रिया में हूं। मैंने हाल ही में एक कार्यक्रम में एक बग खोजने की कोशिश की (बहुत अधिक!) समय मुझे एहसास हुआ कि मुझे एक कंड क्लॉज में 'else' शब्द याद आ रहा था। लेकिन ऐसी परिस्थितियों में व्यवहार थोड़ा अजीब प्रतीत होता है। किसी भी साधारण कार्यक्रम (नीचे) के साथ स्थितियों के साथ प्रयोग करना, जो भी कुछ भी खंड में अपेक्षित के रूप में प्रदर्शित होता है, लेकिन यह भी प्रदर्शित होता है, लेकिन 'अन्य' के बिना, आसपास के डबल कोट्स और गैर-व्याख्या किए गए नए के साथ प्रदर्शित होता है रेखा सचमुच मुद्रित। क्या कोई मुझे बता सकता है कि क्या हो रहा है? TIA।'अन्य' छोड़ा जाने पर एक योजना 'cond' खंड में क्या होता है?

(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 
> 

उत्तर

16

"else" सिर्फ "सत्य" के लिए समानार्थी है। कंड पढ़ने का तरीका परीक्षणों की एक श्रृंखला के रूप में है, जहां पहला परीक्षण है जो वास्तविक कारणों का मूल्यांकन किया जाता है।

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

यहाँ अपने पहले एक

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

cond (eq? x 0) को देखता है और निर्धारित किया है कि झूठी है। अगला खंड (display "whatever\n") है। यह display पर दिखता है, और displaynil नहीं है, यह सच है। इसके बाद यह स्ट्रिंग "whatever\n" का मूल्यांकन करता है, जो कि स्वयं ही मूल्यांकन करता है। तो कंड का मूल्य "whatever\n" है। ,

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

यहाँ पहले टेस्ट झूठा है, और यह दूसरा एक है, जो else है और जो सही का आकलन करने के लिए पर चला जाता है:

अब, यहाँ तुम हो एक दूसरे के। (यदि आप इसके बारे में सोचते हैं, तो "अन्य" का अर्थ सामान्य में होता है, फिर भी: "उन सभी मामलों के लिए सच जहां पिछले परीक्षणों में से कोई भी सत्य नहीं था।")

अब, इसके बाद का फॉर्म (display "whatever\n") है। यह एक ऐसा फ़ंक्शन है जो कंसोल पर स्ट्रिंग तर्क भेजता है और कुछ भी नहीं देता है क्योंकि ऐसा करने के लिए ऐसा होता है। एक और योजना में, यह यह मुद्रण के रूप में के रूप में अच्छी तरह से अपनी स्ट्रिंग मान सकता है, इस स्थिति में आप देखना चाहते हैं

whatever 
"whatever\n" 
+1

दरअसल, आर 5 आरएस योजना में कम से कम, 'else' सत्य का समानार्थी नहीं है। यह सिर्फ एक पहचानकर्ता है कि मैक्रो पहचानता है। –

+1

जो परिचालन रूप से अभी भी सत्य के लिए समानार्थी है। \ –

9

foo समारोह में, cond बयान स्थिति का परीक्षण करने के रूप में display मूल्यांकन करता है। चूंकि वास्तव में display नामक प्रतीक है, इसलिए यह सत्य का मूल्यांकन करता है, इसलिए "whatever\n" का मूल्यांकन (foo 2) के परिणामस्वरूप किया जाता है।

+0

आपका जवाब अद्भुत स्पष्ट और स्वीकार किए जाते हैं जवाब का समान रूप से योग्य था। मैंने चार्ली को अपने सभी टाइपिंग के लिए दिया। बहुत बहुत धन्यवाद। – Leonard

+0

कोई चिंता नहीं, वह इसके लायक है! –

+0

ठीक है, मैंने तुम्हें वैसे भी ऊपर उठाया, ग्रेग। –

संबंधित मुद्दे