আপনি যদি ভেরিয়েবলগুলি নতুন করে সংজ্ঞায়িত করতে ডিএফ ব্যবহার করতে পারেন তবে তা কীভাবে অপরিবর্তনীয় বলে বিবেচিত হবে?


10

ক্লোজার শিখার চেষ্টা করছেন এবং আপনি সহায়তা করতে পারবেন না তবে অবিরত ডেটা সম্পর্কে ক্লোজার কীভাবে হয় তা অবিরত আপনাকে জানানো হবে। তবে আপনি defডান ব্যবহার করে সহজেই কোনও ভেরিয়েবলের নতুন সংজ্ঞা দিতে পারেন ? আমি পেয়েছি ক্লোজুর বিকাশকারীরা এটি এড়াতে পারবেন তবে আপনি যে কোনও ভাষায় ভেরিয়েবল পরিবর্তন করতে পারবেন। কেউ কীভাবে আমাকে ব্যাখ্যা করতে পারেন এটি কীভাবে আলাদা, কারণ আমি মনে করি যে আমি যে টিউটোরিয়াল এবং বইগুলি পড়ছি তা থেকে আমি এটি অনুপস্থিত।

একটি উদাহরণ দিতে কিভাবে হয়

a = 1
a = 2

রুবিতে (বা ব্লুব, যদি আপনি চান) থেকে আলাদা

(def a 1)
(def a 2)

ক্লোজুরে?

উত্তর:


9

যেমন আপনি ইতিমধ্যে লক্ষ্য করেছেন, ক্লোজুরে পরিবর্তিত হওয়ার বিষয়টি নিরুত্সাহিত হওয়ার অর্থ এই নয় যে এটি নিষিদ্ধ এবং এর পক্ষে সমর্থন করার মতো কোনও কাঠামো নেই। সুতরাং আপনি ঠিক বলেছেন যে 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

তবুও ক্লোজুরে প্রচুর কনস্ট্রাক্ট এবং লাইব্রেরি সরবরাহ করে যা মিউটেশন এড়ায় এবং আপনি এগুলি ব্যবহার না করেই অনেক দূর আসতে পারেন। মিউটেশন এড়ানো ক্লোজারে এখন পর্যন্ত পছন্দসই প্রোগ্রামিং স্টাইল।


1
রূপান্তর এড়ানোর পক্ষে পছন্দসই প্রোগ্রামিং স্টাইল। আমি পরামর্শ দেব যে এই বক্তব্যটি আজকাল প্রতিটি ভাষায় প্রযোজ্য; শুধু ক্লোজার নয়;)
ডেভিড আরনো

2

Clojure সব অপরিবর্তনীয় ডেটা সম্পর্কে

ক্লোজওরটি মিউটেশন পয়েন্টগুলি (যেমন , গুলি, গুলি, এবং গুলি) নিয়ন্ত্রণ করে পরিবর্তনীয় স্থিতি পরিচালনা সম্পর্কে । যদিও, অবশ্যই, ইন্টারুপের মাধ্যমে আপনি যে কোনও জাভা কোড ব্যবহার করেন তা ইচ্ছেমতো করতে পারে।RefAtomAgentVar

কিন্তু আপনি সহজেই ডিফ ডান ব্যবহার করে একটি পরিবর্তনশীলকে নতুন সংজ্ঞা দিতে পারেন?

যদি আপনার অর্থ একটি Var(যেমন একটি স্থানীয় ভেরিয়েবলের বিপরীতে) যেমন একটি পৃথক মানের সাথে আবদ্ধ হয় তবে হ্যাঁ। বস্তুত, যেমন উল্লেখ করা Vars, এবং গ্লোবাল এনভায়রনমেন্ট , Varগুলি বিশেষভাবে Clojure চার "রেফারেন্স ধরনের" বলেও অন্তর্ভুক্ত করা হয় (যদিও আমি বলতে চাই তারা প্রধানত উল্লেখ করা হয় গতিশীল Var গুলি সেখানে)।

লিসপ্সের সাথে, আরএপিএল এর মাধ্যমে ইন্টারেক্টিভ, অনুসন্ধানের প্রোগ্রামিং কার্যক্রম সম্পাদনের দীর্ঘ ইতিহাস রয়েছে performing এর মধ্যে প্রায়শই নতুন ভেরিয়েবল এবং ফাংশন সংজ্ঞায়িত করার পাশাপাশি পুরানোগুলির নতুন সংজ্ঞা দেওয়া হয়। যাইহোক, REPL বাইরে পুনরায় defএকটি ing Varবিবেচনা করা হয় দরিদ্র ফর্ম।


1

সাহসী এবং সত্যের জন্য ক্লোজার থেকে

উদাহরণস্বরূপ, রুবিতে আপনি কোনও ভেরিয়েবলের মান বাড়ানোর জন্য একাধিক কার্য সম্পাদন করতে পারেন:

severity = :mild
  error_message = "OH GOD! IT'S A DISASTER! WE'RE "
  if severity == :mild
    error_message = error_message + "MILDLY INCONVENIENCED!"
  else
    error_message = error_message + "DOOOOOOOMED!"
  end

আপনি ক্লোজুরেতে অনুরূপ কিছু করতে প্ররোচিত হতে পারেন:

(def severity :mild)
  (def error-message "OH GOD! IT'S A DISASTER! WE'RE ")
  (if (= severity :mild)
      (def error-message (str error-message "MILDLY INCONVENIENCED!"))
  (def error-message (str error-message "DOOOOOOOMED!")))

যাইহোক, এই জাতীয় নামের সাথে সম্পর্কিত মানটি পরিবর্তন করা আপনার প্রোগ্রামের আচরণটি বোঝা আরও কঠিন করে তুলতে পারে কারণ একটি নামের সাথে কোন মানটি জড়িত বা কেন সেই মানটি পরিবর্তিত হতে পারে তা জানা আরও কঠিন। পরিবর্তনের সাথে মোকাবিলা করার জন্য ক্লোজুরের একটি সরঞ্জাম রয়েছে, যা আপনি দশম অধ্যায়ে শিখবেন, আপনি ক্লজুর শিখতে গিয়ে দেখতে পাবেন যে খুব কমই আপনার নাম / মান সংস্থান পরিবর্তন করতে হবে। আপনি পূর্ববর্তী কোডটি লিখতে পারেন তার একটি উপায় এখানে:

(defn error-message [severity]
   (str "OH GOD! IT'S A DISASTER! WE'RE "
   (if (= severity :mild)
     "MILDLY INCONVENIENCED!"
     "DOOOOOOOMED!")))

(error-message :mild)
  ; => "OH GOD! IT'S A DISASTER! WE'RE MILDLY INCONVENIENCED!"

রুবিতে কেউ কি সহজে একই কাজ করতে পারে না? প্রদত্ত পরামর্শটি কেবল কোনও ফাংশন সংজ্ঞায়িত করার জন্য যা কোনও মান দেয়। রুবিরও রয়েছে ফাংশন!
ইভান জমির

হ্যা আমি জানি. তবে প্রস্তাবিত সমস্যা সমাধানের অপরিহার্য পদ্ধতিটিকে (বাইন্ডিংগুলি পরিবর্তনের মতো) উত্সাহিত করার পরিবর্তে ক্লোজিউর ফানসিওনাল দৃষ্টান্তটি গ্রহণ করে।
টিয়াগো ডাল'ওকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.