स्कीम में फ़ीचर ओरिएंटेड फ़ंक्शनलिटी

छवि नमस्कार। इस लेख में, मैं एक बार फिर से योजना भाषा में ऑब्जेक्ट प्रोग्रामिंग के मुद्दे को उजागर करना चाहूंगा, क्योंकि यह "कंप्यूटर प्रोग्राम की संरचना और व्याख्या" पुस्तक में माना जाता है।
इसके अलावा, मैं उन लोगों को सुझाव देता हूं जिन्होंने प्रोग्रामर स्कीम से पहले कभी भी DrRacket डाउनलोड नहीं किया है और इस लेख से उदाहरणों में चरणों के माध्यम से चलने की कोशिश करते हैं। अनुभवी प्रोग्रामर योजना, रैकेट ... यह लेख बहुत उबाऊ होगा, क्योंकि यह शुरुआती और ऐसे लोगों के लिए लिखा गया है जो रैकेट को "स्पर्श" करना चाहते हैं।

और इसलिए क्रम में। DrRacket IDE में एक शुरुआत के लिए शुरू करें।
एक नई प्रोग्राम फ़ाइल बनाएँ। इसे बचाओ।
भाषा की ओर इंगित करने वाली फ़ाइल की शुरुआत में एक निर्देश डालें:
#lang racket 

फ़ंक्शन को परिभाषित करें:
 (define (func1 x) x) ;    x,  x 

आप इस तरह फ़ंक्शन का उपयोग कर सकते हैं:
 (func1 10) ;   10 


अब हम दूसरे फंक्शन को परिभाषित करते हैं:
 (define (func2) "func2") 

अब एक चर को परिभाषित करने का प्रयास करते हैं, जैसे कि यह दूसरे पर पहला फ़ंक्शन लागू करता है और दूसरा फ़ंक्शन देता है:
 (define x (func1 func2)) ;  x -     func2 

एक समारोह के रूप में x का उपयोग करें:
 (x) ;   "func2" 

यहां हमने इस संभावना का उपयोग किया कि एक फ़ंक्शन फ़ंक्शन वापस कर सकता है, और उनके परिणाम को चर के रूप में परिभाषित किया जा सकता है।
अगला, आइए एक ऐसी वस्तु बनाएं जो आंतरिक चरों और अन्य कार्यों को अंजाम देती है:
 (define (MyObject field1 field2) ;         field1  field2 (let ((f1 field1) ;    f1,   field1 (f2 field2)) ; ... (define (get-f1) f1) ;     f1 (define (get-f2) f2) ; ... (define (set-f1 x) (set! f1 x)) ;  f1  x (define (set-f2 x) (set! f2 x)) ; ... ;     (define (dispatch m) ;       (cond ((eq? m 'get-f1) get-f1) ;  m  get-f1,    get-f1 ((eq? m 'set-f1) set-f1) ; ... ((eq? m 'get-f2) get-f2) ; ... ((eq? m 'set-f2) set-f2) ; ... ) ) dispatch)) ;     MyObject    

ठीक है, ऑब्जेक्ट परिभाषित किया गया है, अब MyObject ऑब्जेक्ट का एक उदाहरण बनाते हैं:
 (define Obj1 (MyObject " Hello " " world!!! ")) ;  Obj1  

अगला, बस उदाहरण का उपयोग करें जैसा हम चाहते हैं:
 (display ((Obj1 'get-f1))) ;  - display -  printf,    ;  ((Obj1 'get-f1))    ,    get-f1 (display ((Obj1 'get-f2))) ;  (newline) ;     ;   " Hello world!!! " 

एक ही वस्तु का एक नया उदाहरण बनाएँ:
 (define Obj2 (MyObject " Hello " " habra!!! ")) ; ; : "Hello Hello habra!!! world!!!" 

आइए निष्पादित करने का प्रयास करें:
 (display ((Obj1 'get-f1))) (display ((Obj1 'get-f2))) (newline) (display ((Obj2 'get-f1))) (display ((Obj2 'get-f2))) (newline) ;   "Hello world!!!" ;  "Hello habra!!!" 

मुझे क्या लगा कि प्रत्येक उदाहरण समान कार्य देता है, लेकिन उनका व्यवहार समान नहीं है।
अर्थात्, C ++ के विपरीत, योजनाएं, अपने उदाहरण से गणना करने के लिए चर और फ़ंक्शन लेती हैं।
यह सुविधा एक या अधिक वस्तुओं के विभिन्न उदाहरणों की आंतरिक स्थितियों को बदलने के लिए कार्यों की सूचियों के संगठन में मदद करती है:
 (define func-list (list (Obj1 'get-f1) (Obj2 'get-f1) (Obj2 'get-f2) (Obj1 'get-f2))) 

हम इस सूची से प्रत्येक फ़ंक्शन का निष्पादन इस प्रकार करते हैं:
(नक्शा (लैम्ब्डा (एक्स) (डिस्प्ले (एक्स))) फंक-लिस्ट)
; परिणाम: “हेलो हेलो हैबरा !!! दुनिया !!! ”

Source: https://habr.com/ru/post/In144598/


All Articles