2009-02-08 21 views
19

योजना में set! असाइनमेंट ऑपरेटर का उपयोग करने का क्या मतलब है? define का उपयोग कर rebind एक चर के लिए एक नए मूल्य के लिए क्यों नहीं?योजना में, "सेट!" का क्या मतलब है?

> (define x 100) 
> (define (value-of-x) x) ;; value-of-x closes over "x" 
> x 
100 
> (value-of-x) 
100 
> (set! x (+ x 1)) 
> x 
101 
> (value-of-x) 
101 
> (define x (+ x 1)) 
> x 
102 
> (value-of-x) 
102 
> 

उत्तर

34

हालांकि define और set! दोनों एक ही दायरे में एक मान को फिर से परिभाषित करेंगे, जब दायरा अलग होता है तो वे दो अलग-अलग चीजें करते हैं। यहाँ एक उदाहरण है:

(define x 3) 

(define (foo) 
    (define x 4) 
    x) 

(define (bar) 
    (set! x 4) 
    x) 

(foo) ; returns 4 
x  ; still 3 
(bar) ; returns 4 
x  ; is now 4 

के रूप में आप किसी भी नाम हैं जो दायरे के भीतर परिभाषित ऐसे नाम हैं जो enclosing दायरे में दिखाई मुखौटा (जैसे जब हम define एक समारोह के रूप में), देख सकते हैं जब हम एक नए शाब्दिक गुंजाइश पैदा करते हैं। इसका मतलब यह है कि जब हम define डी xfoo में, हमने वास्तव में x के लिए एक नया मान बनाया जो पुराने मूल्य को छायांकित करता था। bar में, foo उस दायरे में मौजूद नहीं है, set!x के मान को खोजने और बदलने के लिए संलग्न क्षेत्र को देखता है।

इसके अलावा, जैसा कि अन्य लोगों ने कहा है, आपको केवल define एक बार एक नाम में एक नाम माना जाता है। कुछ कार्यान्वयन आपको कई define एस से दूर जाने देंगे, और कुछ नहीं करेंगे। इसके अलावा, आपको केवल set! का उपयोग उस चर पर किया जाना चाहिए जो पहले से ही define डी है। फिर, इस नियम को लागू करने के लिए कितनी सख्ती से लागू किया गया है।

3

आप शाब्दिक बाइंडिंग का उपयोग जब आप ऐसा नहींdefine उन्हें:

(let ((x 1)) 
    (set! x (+ x 1)) 
    x) 
2

आप आप नए मूल्य के साथ एक नया चर बना है, जबकि वर्ष चर अभी भी पुराने के साथ मौजूद है परिभाषित का उपयोग करते हैं मूल्य; यह सिर्फ नए द्वारा छिपा हुआ है। कमांड लाइन पर आपको सेट करने के लिए अंतर दिखाई नहीं देता है, लेकिन परिभाषित करने के लिए परिभाषित नहीं होगा उदाहरण के लिए एक अनिवार्य कार्यक्रम में एक लूप काउंटर।

+0

आप योजना में लूप काउंटर कैसे डिजाइन करेंगे? –

5

आमतौर पर इसे define एक चर से अधिक एक बार अनुमति नहीं दी जाती है। अधिकांश आरईपीएल इसे चीजों की कोशिश करते समय सुविधा के लिए अनुमति देते हैं, लेकिन यदि आप इसे एक योजना कार्यक्रम में करने का प्रयास करते हैं तो यह आपको एक त्रुटि देगा।

उदाहरण के लिए, mzscheme में, कार्यक्रम

#lang scheme 
(define x 1) 
(define x 2) 

त्रुटि

test.ss:3:8: module: duplicate definition for identifier at: x in: (define-values (x) 2) 

इसके अलावा देता है, define एक अलग अर्थ है जब अन्य संदर्भों के अंदर इस्तेमाल किया है। कार्यक्रम

#lang scheme 
(define x 1) 
x 
(let() 
    (define x 2) 
    x) 
x 

उत्पादन

1 
2 
1 

इसका कारण यह है कुछ निर्माणों के अंदर define रों वास्तव में letrec रों रूप में माना जाता है।

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