सब कुछ एक फ़ंक्शन है: David Beazley और SICP लेक्चर पर एक समीक्षा
(ezzeriesa.notion.site)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 को जैसा है वैसा ही लौटाता है (identityfunction)।incrementfunction 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 टिप्पणियां
Hacker News राय
SICP लेक्चर में जानकारी का घनत्व बहुत अधिक है, लेकिन छात्रों के Q&A और ब्लैकबोर्ड के इस्तेमाल आदि के कारण इसमें काफी समय लगता है। लेक्चर का क्रम भी दोबारा व्यवस्थित किया जा सकता है। व्यक्तिगत रूप से मैं एक नई वीडियो सीरीज़ की योजना बना रहा हूँ
state को pure function के रूप में encode करने का तरीका पेश किया गया। विभिन्न डेटा के लिए pure functional encoding मौजूद हैं
ब्लॉग पोस्ट के URL anchor/hash की वजह से मैं सीधे postscript पर पहुँच गया, जिससे भ्रम हुआ
cons/car/cdr को lambda से implement करना पहली बार देखने पर जादू जैसा लगा। यह दिखाता है कि language runtime को key/value dictionary implement करनी पड़ती है
David Beazley, Python दुनिया की एक दिग्गज शख्सियत हैं, और यह लेक्चर शुरुआत में चौंकाने वाला लगा, लेकिन जल्द ही यह एकदम परफेक्ट संयोजन लगा। मैंने अगली लेक्चर सीरीज़ के लिए पंजीकरण कर लिया
inductive data type की आवश्यकता वाले विचार से परिचय हुआ। केवल Church encoding से
0 != 1जैसे प्रमेयों को सिद्ध नहीं किया जा सकतालेख स्वयं रोचक था, लेकिन पेज नेविगेशन कठिन था। कीबोर्ड के arrow keys से स्क्रॉल नहीं हो रहा था
"वैकल्पिक मॉडल" सेक्शन के कोड में टाइपो है।
fibकी जगहfibonacciइस्तेमाल होना चाहिए। GitHub रिपॉज़िटरी का कोड सही हैकिताब पर चल रही चर्चा का एक लिंक है। यह जिज्ञासा है कि लिंक सीधे पेज के निचले हिस्से की चर्चा पर क्यों जाता है। यह भी जिज्ञासा है कि क्या इसे किसी दूसरी चर्चा में समाहित किया जा सकता है
YouTube लिंक दिया गया है