Closure
ক্লোজার
একটা function value তার definition-site-এর environment-এর reference সাথে ধরে রাখে — তাই function ফেরত গেলেও সেই frame-এর variable গুলো জীবিত থাকে।
Function value = code + captured environment। দ্বিতীয় অংশটাই closure:
def make_adder(n): # n — local
return lambda x: x + n
add5 = make_adder(5) # make_adder ফেরত গেছে
add5(3) # তবু n=5 জীবিত → 8
- Lexical scoping মানে capture হয় definition-site-এর env, call-site-এর না
- Captured variable যদি mutable হয়, সব closure একই cell share করে — এখানেই কমন bug
- Runtime-এর দৃষ্টিতে closure একটা object: code pointer + env pointer — তাই env জীবিত থাকতে heap-এ থাকতে হয়, আর GC-র reachability-তে ঢোকে
Python-এ __closure__, JavaScript-এ অদৃশ্য, C-তে নেই (lambda+capture দিয়ে হাতে বানাতে হয়)।