এসাইনমেন্ট অপারেটর =
এবং <-
আর এর মধ্যে পার্থক্য কী ?
যেমন আপনার উদাহরণটি দেখায়, =
এবং <-
কিছুটা অপারেটর প্রাধান্য রয়েছে (যা তারা যখন একই অভিব্যক্তিতে মিশ্রিত হয় তখন মূল্যায়নের ক্রম নির্ধারণ করে)। আসলে, ?Syntax
আর এ নিম্নলিখিত অপারেটরকে অগ্রাধিকার সারণী দেয়, সর্বোচ্চ থেকে নীচে পর্যন্ত:
…
‘-> ->>’ rightwards assignment
‘<- <<-’ assignment (right to left)
‘=’ assignment (right to left)
…
তবে এটাই কি একমাত্র পার্থক্য?
যেহেতু আপনি অ্যাসাইনমেন্ট অপারেটরগুলি সম্পর্কে জিজ্ঞাসা করেছিলেন : হ্যাঁ, এটিই কেবলমাত্র পার্থক্য। তবে অন্যথায় বিশ্বাস করার জন্য আপনাকে ক্ষমা করা হবে। এমনকি ?assignOps
দাবিগুলির আর ডকুমেন্টেশন আরও বেশি পার্থক্য রয়েছে:
অপারেটরটি <-
যে কোনও জায়গায় ব্যবহার করা যেতে পারে, তবে অপারেটরটিকে =
কেবলমাত্র শীর্ষ স্তরে (যেমন, কমান্ড প্রম্পটে টাইপ করা সম্পূর্ণ এক্সপ্রেশনটিতে) বা এক্সপ্রেশনগুলির একটি ব্রেসড তালিকার একটি সফল এক্সপ্রেশন হিসাবে অনুমোদিত।
আসুন এটির উপরে খুব একটা সূক্ষ্ম বিন্দু রাখি না: আর ডকুমেন্টেশন ভুল (সূক্ষ্মভাবে) ভুল [ 1 ] । এটি দেখানো সহজ: আমাদের কেবল =
অপারেটরের একটি পাল্টা উদাহরণ খুঁজে বের করতে হবে যা শীর্ষ স্তরে (ক) নয়, (খ) এক্সপ্রেশনগুলির একটি বন্ধনীযুক্ত তালিকায় একটি সফল এক্সপ্রেশন (অর্থাত {…; …}
)। - আরও ঝামেলা ছাড়া:
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
স্পষ্টতই আমরা প্রাসঙ্গিক =
(ক) এবং (খ) এর বাইরে ব্যবহার করে একটি কার্য সম্পাদন করেছি । সুতরাং, কয়েক দশক ধরে কেন একটি মূল আর ভাষার বৈশিষ্ট্যটির ডকুমেন্টেশন ভুল হয়েছে?
কারণ আর এর বাক্য গঠনতে প্রতীকটির =
দুটি স্বতন্ত্র অর্থ রয়েছে যা নিয়মিত সঙ্কোচিত হয়:
- প্রথম অর্থ একটি অ্যাসাইনমেন্ট অপারেটর হিসাবে । আমরা এতক্ষণ এই বিষয়ে কথা বললাম।
- দ্বিতীয় অর্থটি অপারেটর নয় বরং সিনট্যাক্স টোকেন যা কোনও ফাংশন কলে পাস করার সংকেত নামের আভাস দেয় ।
=
অপারেটরের বিপরীতে এটি রানটাইমের সময় কোনও পদক্ষেপ নেয় না, এটি কেবল একটি এক্সপ্রেশনকে বিশ্লেষণ করার পদ্ধতি পরিবর্তন করে।
দেখা যাক.
সাধারণ ফর্মের যে কোনও কোডের অংশে ...
‹function_name›(‹argname› = ‹value›, …)
‹function_name›(‹args›, ‹argname› = ‹value›, …)
... =
করছে: টোকেন যে সংজ্ঞায়িত নামে যুক্তি ক্ষণস্থায়ী হয় না অ্যাসাইনমেন্ট অপারেটর। তদতিরিক্ত, কিছু সিন্ট্যাক্টিকিক প্রসঙ্গে =
সম্পূর্ণ নিষিদ্ধ :
if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …
এর মধ্যে যে কোনও একটি ত্রুটি উত্থাপন করবে "অপ্রত্যাশিত '=' ›bla› 'তে।
অন্য কোনও প্রসঙ্গে =
অ্যাসাইনমেন্ট অপারেটর কলকে বোঝায়। বিশেষত, সবেমাত্র এক্সপ্রেসনের চারপাশে কেবল প্রথম বন্ধনী স্থাপন করা উপরের যে কোনওটিকে (ক) বৈধ এবং (খ) একটি কার্যনির্বাহী করে তোলে । উদাহরণস্বরূপ, নিম্নলিখিত কার্য সম্পাদন করে:
median((x = 1 : 10))
তবে এছাড়াও:
if (! (nf = length(from))) return()
এখন আপনি আপত্তি করতে পারেন যে এই জাতীয় কোডটি নৃশংস (এবং আপনি ঠিক থাকতে পারেন)। কিন্তু আমি থেকে এই কোড গ্রহণ base::file.copy
ফাংশন (প্রতিস্থাপন <-
সঙ্গে =
) - এটা কোর আর কোডবেস অনেক একটি পরিব্যাপক প্যাটার্ন আছে।
জন চেম্বার দ্বারা মূল ব্যাখ্যা , যা আর ডকুমেন্টেশন সম্ভবত উপর ভিত্তি করে তৈরি, আসলে সঠিকভাবে এই ব্যাখ্যা করে:
=
ব্যাকরণে কেবলমাত্র দুটি জায়গায় [ অ্যাসাইনমেন্টের অনুমতি রয়েছে] শীর্ষ স্তরে (সম্পূর্ণ প্রোগ্রাম বা ব্যবহারকারী-টাইপযুক্ত অভিব্যক্তি হিসাবে); এবং আশেপাশের যৌক্তিক কাঠামো থেকে যখন পৃথক করা হয় তখন বন্ধনীগুলি বা একটি অতিরিক্ত জুটি বন্ধনী।
একটি স্বীকারোক্তি: আমি আগে মিথ্যা বলেছি। সেখানে হয় মধ্যে একটি অতিরিক্ত পার্থক্য =
এবং <-
অপারেটরদের তারা স্বতন্ত্র ফাংশন কল। ডিফল্টরূপে এই ফাংশনগুলি একই কাজ করে তবে আচরণ পরিবর্তন করতে আপনি এগুলির দুটি পৃথক করে ওভাররাইড করতে পারেন। বিপরীতে, <-
এবং ->
(বাম থেকে ডান অ্যাসাইনমেন্ট), সিন্টেক্সিকভাবে পৃথক হলেও সর্বদা একই ফাংশনটিকে কল করে । একজনকে ওভাররাইড করা অন্যটিকে ওভাররাইড করে। এটি জানা খুব কমই ব্যবহারিক তবে এটি মজাদার শেননিগানদের জন্য ব্যবহার করা যেতে পারে ।
<-
প্রতীকটির উত্সগুলি পুরানো এপিএল কীবোর্ড থেকে আসে যা আসলে তাদের একক<-
কী ছিল ।