কল-বাই-ভ্যালু এবং কল-বাই-রেফারেন্স এমন বাস্তবায়ন কৌশল যা বহুদিন আগে প্যারামিটার-পাসিং মোডগুলির জন্য ভুল হয়েছিল।
শুরুতে, ফরটারন ছিল। ফরট্রানের কেবলমাত্র কল বাই রেফারেন্স ছিল, যেহেতু সাবরুটাইনগুলি তাদের প্যারামিটারগুলি সংশোধন করতে সক্ষম হয়েছিল এবং একাধিক প্যারামিটার-পাসিং মোডগুলিকে অনুমতি দেওয়ার জন্য কম্পিউটিং চক্রগুলি খুব ব্যয়বহুল ছিল, এবং যখন ফরটারনের প্রথম সংজ্ঞা দেওয়া হয়েছিল তখন প্রোগ্রামিং সম্পর্কে যথেষ্ট জানা ছিল না।
ALGOL কল-বাই-নাম এবং কল-বাই-মান নিয়ে আসে। কল-বাই-ভ্যালু এমন জিনিসের জন্য যা পরিবর্তন করার কথা ছিল না (ইনপুট পরামিতি)। কল-বাই-নাম আউটপুট পরামিতিগুলির জন্য ছিল। কল-বাই-নামটি একটি প্রধান ক্রক হিসাবে দেখা গেছে এবং ALGOL 68 এটিকে ফেলে দিয়েছে।
পাস্কাল কল-বাই-মান এবং কল-বাই-রেফারেন্স সরবরাহ করে। প্যারামিটার স্ট্যাকটি ফুঁকতে দেওয়া এড়ানোর জন্য প্রোগ্রামারকে সংকলকটি বলে যে তিনি একটি বৃহত বস্তু (সাধারণত একটি অ্যারে) রেফারেন্স দ্বারা পাস করছেন, তবে কোনও উপায় পরিবর্তিত করা উচিত নয় changed
পাস্কাল ভাষা নকশা অভিধানটিতে পয়েন্টার যুক্ত করেছে।
সি কল-বাই-ভ্যালু সরবরাহ করে এবং মেমরির একটি স্বেচ্ছাসেবী বস্তুটিতে একটি পয়েন্টার ফিরিয়ে দিতে ক্লডজ অপারেটরকে সংজ্ঞায়িত করে কল-বাই-রেফারেন্স দেয়।
পরবর্তী ভাষাগুলি সি-র অনুলিপি করেছিল, বেশিরভাগ কারণেই ডিজাইনাররা আর কিছুই দেখেনি। কল-বাই-ভ্যালু এত জনপ্রিয় তাই সম্ভবত।
সি ++ কল-বাই-রেফারেন্স সরবরাহ করতে সি ক্লডজের উপরে একটি ক্লডজ যুক্ত করেছে।
এখন, কল-বাই-মান বনাম কল-বাই-রেফারেন্স বনাম কল-বাই-পয়েন্টার-ক্লডজ, সি এবং সি ++ (প্রোগ্রামারস) এর কনট পয়েন্টার এবং পয়েন্টার সহ কনস্ট (কেবল পঠনযোগ্য) সহ ভয়ঙ্কর মাথাব্যথা রয়েছে অবজেক্ট।
আদা পুরো দুঃস্বপ্নটি এড়াতে সক্ষম হয়েছিল।
আদার স্পষ্ট কল-বাই-মান বনাম কল-বাই-রেফারেন্স নেই। পরিবর্তে, অ্যাডা প্যারামিটারে রয়েছে (যা পড়তে পারে তবে লিখিত নাও হতে পারে), পরামিতিগুলি (যা তারা পড়ার আগে লিখতে হবে) এবং আউট প্যারামিটারে, যা কোনও ক্রমে পড়ে এবং লিখিত হতে পারে। সংকলক সিদ্ধান্ত নেয় যে কোনও নির্দিষ্ট পরামিতিটি মান দ্বারা বা রেফারেন্স দ্বারা পাস করা হয়েছে: এটি প্রোগ্রামারের কাছে স্বচ্ছ।
void acceptEntireProgrammingLanguageByValue(C++);