যেমন আপনি ইতিমধ্যে লক্ষ্য করেছেন, ক্লোজুরে পরিবর্তিত হওয়ার বিষয়টি নিরুত্সাহিত হওয়ার অর্থ এই নয় যে এটি নিষিদ্ধ এবং এর পক্ষে সমর্থন করার মতো কোনও কাঠামো নেই। সুতরাং আপনি ঠিক বলেছেন যে def
অন্যান্য পরিবেশে অ্যাসাইনমেন্টের মতোই আপনি পরিবেশের একটি বাঁধার পরিবর্তন / পরিবর্তন করতে পারেন ( ওয়ার্সের ক্লোজার ডকুমেন্টেশন দেখুন )। বৈশ্বিক পরিবেশে বাইন্ডিংগুলি পরিবর্তন করে আপনি ডেটা অবজেক্টগুলিও পরিবর্তন করেন যা এই বাইন্ডিংগুলি ব্যবহার করে। উদাহরণ স্বরূপ:
user=> (def x 1)
#'user/x
user=> (defn f [y] (+ x y))
#'user/f
user=> (f 1)
2
user=> (def x 100)
#'user/x
user=> (f 1)
101
লক্ষ্য করুন যে বাঁধাইয়ের জন্য পুনরায় সংজ্ঞা দেওয়ার পরে x
, ফাংশনটিও f
পরিবর্তিত হয়েছে, কারণ তার শরীর সেই বাঁধাই ব্যবহার করে।
এর সাথে এমন ভাষার সাথে তুলনা করুন যেখানে ভেরিয়েবলের নতুন সংজ্ঞা দেওয়া পুরানো বাইন্ডিং মুছে না তবে কেবল এটিকে ছায়া দেয়, অর্থাত্ এটি নতুন সংজ্ঞা দেওয়ার পরে যে পরিধি আসে তাকে অদৃশ্য করে তোলে। আপনি যদি এসএমএল REPL তে একই কোডটি লিখেন তবে কী ঘটে তা দেখুন:
- val x = 1;
val x = 1 : int
- fun f y = x + y;
val f = fn : int -> int
- f 1;
val it = 2 : int
- val x = 100;
val x = 100 : int
- f 1;
val it = 2 : int
লক্ষ্য করুন যে দ্বিতীয় সংজ্ঞা দেওয়ার পরে x
, ফাংশনটি f
এখনও সেই বাঁধাই ব্যবহার করে x = 1
যা স্কোপ ছিল যখন এটি সংজ্ঞায়িত করা হয়েছিল, অর্থাৎ বাইন্ডিংটি val x = 100
পূর্ববর্তী বাইন্ডিংটিকে ওভাররাইট করে না val x = 1
।
বটমলাইন: ক্লোজুরে বৈশ্বিক পরিবেশকে পরিবর্তিত করতে এবং এর সাথে আবদ্ধকরণগুলিকে নতুন করে সংজ্ঞা দিতে দেয় allows এসএমএলের মতো অন্যান্য ভাষাগুলি যেমন এটি এড়ানো সম্ভব হবে তবে def
ক্লোজুরে নির্মাণটি বিশ্বব্যাপী পরিবেশের অ্যাক্সেস এবং পরিবর্তনকে বোঝানো। অনুশীলনে, জাভা, সি ++, পাইথনের মতো বাধ্যতামূলক ভাষায় অ্যাসাইনমেন্ট কী করতে পারে তার সাথে এটি খুব মিল similar
তবুও ক্লোজুরে প্রচুর কনস্ট্রাক্ট এবং লাইব্রেরি সরবরাহ করে যা মিউটেশন এড়ায় এবং আপনি এগুলি ব্যবহার না করেই অনেক দূর আসতে পারেন। মিউটেশন এড়ানো ক্লোজারে এখন পর্যন্ত পছন্দসই প্রোগ্রামিং স্টাইল।