2010-08-17 16 views
10

मैं जब guile का उपयोग कर एक योजना कार्यक्रम में + ऑपरेटर को पुनर्परिभाषित एक अप्रत्याशित परिणाम प्राप्त किया। मुझे यह इंगित करना चाहिए कि भाषा को समझने के लिए प्रयोग करते समय यह हुआ; एक उपयोगी कार्यक्रम लिखने के लिए यहां कोई प्रयास नहीं है।योजना: पूर्वनिर्धारित ऑपरेटर को फिर से परिभाषित करते समय यह परिणाम क्यों होता है?

(define (f a b) 4) 

(define (show) 
    (display (+ 2 2)) (display ",") (display (f 2 2)) (newline)) 

(show) 
; guile & mit-scheme: "4,4" 

(define (+ a b) 5) 
(define (f a b) 5) 

(show) 
; mit-scheme: "5,5" 
; guile: "4,5" - this "4" is the unexpected result 

(define (show) 
    (display (+ 2 2)) (display ",") (display (f 2 2)) (newline)) 

(show) 
; guile & mit-scheme: "5,5" 

guile में समारोह show+ के पूर्वनिर्धारित परिभाषा के बाद भी मैं इसे नए सिरे से परिभाषित किया है, हालांकि यह f की नई परिभाषा का उपयोग करता है का उपयोग करता है:

कोड यह रहा। + की नई परिभाषा को पहचानने के लिए मुझे show को फिर से परिभाषित करना होगा। mit-scheme में दोनों नई परिभाषाएं तत्काल पहचानी जाती हैं, जो मैं होने की उम्मीद कर रहा था। इसके अलावा, + के किसी भी आगे की परिभाषाओं तुरन्त show को फिर से परिभाषित करने के लिए बिना दोनों व्याख्याकारों द्वारा मान्यता प्राप्त हैं।

guile में दृश्यों के पीछे क्या चल रहा है ताकि यह इन परिभाषित ऑपरेटरों के अलग-अलग संदर्भों को बाध्य कर सके?

और क्यों दो दुभाषियों के बीच क्या अंतर है?

+0

दिलचस्प। बहुत स्पष्ट रूप से समझाया प्रश्न के लिए +1। –

उत्तर

7

ऐसा लगता है कि छल की तरह गलत तरीके से संभालने है कि कोई भी पर्याप्त पागल + को फिर से परिभाषित करने के लिए है और (+ 2 2) => 4 तह के अनुकूलन बना रही है, जिससे (display (+ 2 2)) बन (display 4)। यही कारण है कि बताएं कि आप अपना नया + प्रतिबिंबित करने के लिए में show फिर से परिभाषित करने की आवश्यकता होगी।

वास्तव में, अगर आप पहली बार अपने कार्यक्रम के शीर्ष पर (define (+ a b) 4) करते हैं, छल कि अनुकूलन काम नहीं चलेगा और तुम सिर्फ एमआईटी योजना की तरह 4,4 और 5,5 मिल जाएगा।

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

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

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