2 पॉइंट द्वारा GN⁺ 2024-11-18 | 1 टिप्पणियां | WhatsApp पर शेयर करें

David Beazley और SICP लेक्चर पर समीक्षा: 1 हफ़्ते का अनुभव

2022 के अंत में David Beazley के SICP लेक्चर में भाग लेने का अपना अनुभव साझा किया गया है। कई मुफ़्त संसाधन उपलब्ध हैं, लेकिन Dave का लेक्चर खास विषयों को चुनकर उन्हें गहराई से समझाने की वजह से बेहद प्रभावी था।

शुरुआत

SICP लेक्चर Scheme भाषा में हुआ, और इसमें Python में एक सरल Scheme interpreter लागू करके बुनियादी अवधारणा substitution मॉडल को समझाया गया।

Scheme भाषा की बुनियाद

  • Primitive: मूल मान (जैसे integer)
  • Operator: +, -, *, / जैसे मूल operations को prefix notation में उपयोग करना
  • define: वेरिएबल परिभाषित करना
> (define x 2)  
> (+ x 3) ; 결과: 5  
  • if: conditional statement
  • lambda: anonymous function परिभाषित करना
> ((lambda (x) (* x x)) 3) ; 결과: 9  

Python में Scheme interpreter

Python का उपयोग करके Scheme कोड को evaluate करने वाला एक सरल interpreter लागू किया गया। मूल operations को Python functions के रूप में परिभाषित किया गया।

definitions = {  
    "+": lambda x, y: x + y,  
    "*": lambda x, y: x * y,  
}  

उदाहरण:

> evaluate(("+", 2, 3)) # 결과: 5  

इसमें define और lambda का implementation, साथ ही conditional if की handling भी शामिल थी।

substitution model

substitution model प्रोग्राम को समझने का एक सरल तरीका है, जिसमें variables को values से बदलते हुए प्रोग्राम को evaluate किया जाता है। लेकिन जब assignment शामिल होता है, तो यह मॉडल विफल हो जाता है।

State

substitution model के टूटने के उदाहरण के रूप में assignment को लिया जा सकता है। उदाहरण के लिए, बैंक खाते का balance मॉडल करते समय set! का उपयोग करके variable को update किया जाता है।

(define balance 100)  
  
(define (withdraw amount)  
  (set! balance (- balance amount))  
  balance)  

इस स्थिति में substitution model पहले और बाद के balance state में अंतर नहीं कर पाता।

इसलिए Environment मॉडल की ज़रूरत पड़ती है। Variables environment के भीतर परिभाषित होते हैं, और हर procedure का अपना environment होता है।

Streams

state को मॉडल करने का एक और तरीका Streams है। Streams lazy evaluation के ज़रिए भविष्य के values को भी मॉडल कर सकते हैं।

infinite loop और evaluation order

evaluation order का अंतर: ज़्यादातर भाषाएँ applicative-order evaluation का उपयोग करती हैं, जिसमें arguments को पहले evaluate किया जाता है।

> (square (+ 1 2)) ; 결과: 9  

लेकिन normal-order evaluation arguments की evaluation को तब तक टालता है जब तक उनकी वास्तव में ज़रूरत न हो। इससे infinite loop से बचा जा सकता है।

> (define (p) (p))  
> (define (test x y) (if (= x 0) 0 y))  
> (test 0 (p)) ; 정상 순서에서는 0 반환, 적용 순서에서는 무한 루프  

lambda calculus और Church numerals

Church encoding के माध्यम से numbers को procedures के रूप में व्यक्त किया जा सकता है। यह functional programming की एक महत्वपूर्ण अवधारणा है।

(define (zero f) (lambda (x) x))  
(define (increment n) (lambda (f) (lambda (x) (f ((n f) x)))))  
  • zero वह function है जो argument को जैसा है वैसा ही लौटाता है (identity function)।
  • increment function application को एक बार और लागू करता है।

उदाहरण

> ((zero (lambda (x) (+ x 1))) 0) ; 결과: 0  
> (((increment zero) (lambda (x) (+ x 1))) 0) ; 결과: 1  

iteration vs recursion

Scheme for loop की जगह recursion का उपयोग करके दोहराए जाने वाले काम करता है।

recursion उदाहरण: factorial

(define (factorial n)  
  (if (= n 1)   
    1   
    (* n (factorial (- n 1)))))  

यह recursive call stack का उपयोग करता है, इसलिए यह काफ़ी memory ले सकता है।

tail-call optimization

Scheme tail-call optimization के ज़रिए memory usage कम करता है। इसकी वजह से यह iterative process की तरह काम कर सकता है।

(define (factorial n)  
  (define (iter product counter)  
    (if (> counter n)  
        product  
        (iter (* product counter) (+ counter 1))))  
  (iter 1 1))  

समापन

David Beazley का लेक्चर SICP की प्रमुख अवधारणाओं को चुनकर गहराई से कवर करता है। खास तौर पर यह functional programming, lambda calculus और evaluation order जैसे विभिन्न programming paradigms को समझने में मदद करता है।

Knuth का उद्धरण

अगर आप सिर्फ़ theory पढ़ रहे हैं, तो इसका मतलब है कि अब practical पहलुओं पर ध्यान देने का समय है; और अगर आप सिर्फ़ practice कर रहे हैं, तो इसका मतलब है कि अब theoretical पहलुओं पर ध्यान देने का समय है।

1 टिप्पणियां

 
GN⁺ 2024-11-18
Hacker News राय
  • SICP लेक्चर में जानकारी का घनत्व बहुत अधिक है, लेकिन छात्रों के Q&A और ब्लैकबोर्ड के इस्तेमाल आदि के कारण इसमें काफी समय लगता है। लेक्चर का क्रम भी दोबारा व्यवस्थित किया जा सकता है। व्यक्तिगत रूप से मैं एक नई वीडियो सीरीज़ की योजना बना रहा हूँ

    • SICP लेक्चर Python जैसी आधुनिक भाषा का उपयोग करते हुए भी अपने मूल उद्देश्य को बनाए रखता है
    • Python एक multi-paradigm भाषा है, इसलिए इसकी अभिव्यक्ति क्षमता बहुत अच्छी है
  • state को pure function के रूप में encode करने का तरीका पेश किया गया। विभिन्न डेटा के लिए pure functional encoding मौजूद हैं

    • encoding उलझाऊ हो सकती है, लेकिन यह सुरुचिपूर्ण और संक्षिप्त है
    • JavaScript में Maybe monad को functional तरीके से implement करने का एक उदाहरण दिखाया गया
  • ब्लॉग पोस्ट के URL anchor/hash की वजह से मैं सीधे postscript पर पहुँच गया, जिससे भ्रम हुआ

  • cons/car/cdr को lambda से implement करना पहली बार देखने पर जादू जैसा लगा। यह दिखाता है कि language runtime को key/value dictionary implement करनी पड़ती है

  • David Beazley, Python दुनिया की एक दिग्गज शख्सियत हैं, और यह लेक्चर शुरुआत में चौंकाने वाला लगा, लेकिन जल्द ही यह एकदम परफेक्ट संयोजन लगा। मैंने अगली लेक्चर सीरीज़ के लिए पंजीकरण कर लिया

    • यह दिखाता है कि software engineer की सतत शिक्षा आगे कैसे चल सकती है
  • inductive data type की आवश्यकता वाले विचार से परिचय हुआ। केवल Church encoding से 0 != 1 जैसे प्रमेयों को सिद्ध नहीं किया जा सकता

    • संबंधित सामग्री Notion पर पोस्ट की गई
  • लेख स्वयं रोचक था, लेकिन पेज नेविगेशन कठिन था। कीबोर्ड के arrow keys से स्क्रॉल नहीं हो रहा था

  • "वैकल्पिक मॉडल" सेक्शन के कोड में टाइपो है। fib की जगह fibonacci इस्तेमाल होना चाहिए। GitHub रिपॉज़िटरी का कोड सही है

  • किताब पर चल रही चर्चा का एक लिंक है। यह जिज्ञासा है कि लिंक सीधे पेज के निचले हिस्से की चर्चा पर क्यों जाता है। यह भी जिज्ञासा है कि क्या इसे किसी दूसरी चर्चा में समाहित किया जा सकता है

  • YouTube लिंक दिया गया है