ল্যাম্বডা ক্যালকুলাস 30 এর দশকে অ্যালোনজো চার্চ দ্বারা আবিষ্কার করা একটি গণনার মডেল। বেশিরভাগ কার্যকরী প্রোগ্রামিং ভাষার সিনট্যাক্স এবং শব্দার্থবিদ্যা ল্যাম্বডা ক্যালকুলাস দ্বারা প্রত্যক্ষ বা অপ্রত্যক্ষভাবে অনুপ্রাণিত হয়।
ল্যাম্বদা ক্যালকুলাসটি এর সবচেয়ে প্রাথমিক আকারে দুটি অপারেশন রয়েছে: অ্যাবস্ট্রাকশন (একটি অজ্ঞাতনামা) ফাংশন তৈরি করা) এবং অ্যাপ্লিকেশন (কোনও ফাংশন প্রয়োগ করুন)। ল্যাবড্ডা ক্যালকুলাসটিকে এর নাম দিয়ে Ab অপারেটর ব্যবহার করে বিমূর্তি সঞ্চালিত হয়।
- লাম্বদা এক্সপ্রেশন
- লাম্বদা ফাংশন
বেনামে ফাংশনগুলি প্রায়শই "ল্যাম্বডাস", "ল্যাম্বডা ফাংশন" বা "ল্যাম্বডা এক্সপ্রেশন" নামে পরিচিত কারণ আমি আগেই বলেছি, ল্যাম্বডা ক্যালকুলাসে বেনাম ফাংশন তৈরির প্রতীক ছিল (এবং এই শব্দটি lambda
অনেক লিস্পে বেনাম ফাংশন তৈরি করতে ব্যবহৃত হয়) একই কারণে ভাষা ভিত্তিক)।
এটি কোনও ব্যবহৃত ব্যবহৃত শব্দ নয়, তবে আমি ধরে নিই এর অর্থ বেনামে ফাংশন ব্যবহার করে প্রোগ্রামিং করা বা উচ্চ-ক্রম ফাংশনগুলি ব্যবহার করে প্রোগ্রামিং।
সি ++ 0 এক্স-এ ল্যাম্বডাস সম্পর্কে আরও কিছু তথ্য, তাদের অনুপ্রেরণা এবং কীভাবে তারা পয়েন্টারগুলির সাথে কাজ করে (এটি অনেকটাই সম্ভবত আপনি ইতিমধ্যে যা জানেন তার একটি পুনরাবৃত্তি, তবে আমি আশা করি এটি ল্যাম্বডাসের অনুপ্রেরণা এবং তারা কীভাবে পৃথক হয় তা ব্যাখ্যা করতে সহায়তা করে) ফাংশন পয়েন্টার থেকে):
ফাংশন পয়েন্টারগুলি, যা ইতিমধ্যে সি-তে বিদ্যমান ছিল, উদাহরণস্বরূপ একটি বাছাইকরণ ফাংশনে তুলনা ফাংশনটি পাস করতে বেশ কার্যকর। তবে তাদের দরকারীতার সীমাবদ্ধতা রয়েছে:
উদাহরণস্বরূপ, যদি আপনি i
প্রতিটি ভেক্টরের (যেখানে i
একটি রান-টাইম প্যারামিটার থাকে) তম উপাদান দ্বারা ভেক্টরগুলির কোনও ভেক্টরকে বাছাই করতে চান, তবে আপনি এটি কোনও ফাংশন পয়েন্টার দিয়ে সমাধান করতে পারবেন না। একটি ফাংশন যা দুটি ভেক্টরকে তাদের i
তম উপাদানের সাথে তুলনা করে , তার জন্য তিনটি আর্গুমেন্ট ( i
এবং দুটি ভেক্টর) নেওয়া প্রয়োজন , তবে বাছাইকরণ ফাংশনটিতে দুটি আর্গুমেন্ট গ্রহণের একটি ফাংশন প্রয়োজন need আমাদের যা প্রয়োজন তা হল i
বাছাই ফাংশনে পাস করার আগে কোনওভাবে ফাংশনটিতে আর্গুমেন্ট সরবরাহ করার একটি উপায় , তবে আমরা সাদামাটা সি ফাংশন দিয়ে এটি করতে পারি না।
এটি সমাধানের জন্য, সি ++ "ফাংশন অবজেক্টস" বা "ফান্টেক্টর" ধারণাটি চালু করেছিলেন। ফান্টেক্টর মূলত একটি অবজেক্ট যা একটি operator()
পদ্ধতি আছে। এখন আমরা একটি শ্রেণি সংজ্ঞায়িত করতে পারি CompareByIthElement
, যা আর্গুমেন্টটিকে i
কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে গ্রহণ করে এবং তারপরে দুটি ভেক্টরকে operator()
পদ্ধতির সাথে আর্গুমেন্ট হিসাবে তুলনা করতে লাগে । i
তম উপাদান দ্বারা ভেক্টরগুলির একটি ভেক্টরকে বাছাই করার জন্য আমরা এখন একটি আর্গুমেন্ট হিসাবে একটি CompareByIthElement
বস্তু তৈরি করতে পারি i
এবং তারপরে সেই বস্তুটিকে বাছাইকরণ ফাংশনে পাস করতে পারি।
যেহেতু ফাংশন অবজেক্টগুলি কেবলমাত্র বস্তু এবং প্রযুক্তিগতভাবে ফাংশন নয় (যদিও তারা তাদের মতো আচরণ করার জন্য বোঝানো হয়), আপনি কোনও ফাংশন অবজেক্টে ফাংশন পয়েন্টার পয়েন্ট করতে পারবেন না (অবশ্যই আপনার কোনও ফাংশন অবজেক্টের জন্য একটি পয়েন্টার থাকতে পারে, তবে এটি এর মতো একটি ধরণ থাকবে CompareByIthElement*
এবং এটি কোনও ফাংশন পয়েন্টার নয়)।
সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে বেশিরভাগ ফাংশন যা আর্গুমেন্ট হিসাবে ফাংশন নেয় তা টেমপ্লেটগুলি ব্যবহার করে সংজ্ঞায়িত করা হয় যাতে তারা ফাংশন পয়েন্টারগুলির পাশাপাশি ফাংশন অবজেক্টগুলির সাথে কাজ করে।
এখন ল্যাম্বডাস:
i
আপনি যদি কখনও কোনও ভেক্টরকে বাছাই করার জন্য একবার ব্যবহার করতে চলেছেন তবে একটি মৌলিক উপাদানটিকে তম উপাদানটির সাথে তুলনা করতে সংজ্ঞায়িত করা কিছুটা ভার্জোজ। এমনকি যদি আপনার কেবলমাত্র একটি ফাংশন পয়েন্টার প্রয়োজন হয়, একটি নামকৃত ফাংশনটি সংজ্ঞায়িত করা উপ-অনুকূল হয় যদি এটি কেবল একবার ব্যবহার করা হয় কারণ ক) এটি নামস্থানটি দূষিত করে এবং খ) ফাংশনটি সাধারণত খুব ছোট হতে চলেছে এবং সত্যই সেখানে নেই isn't যুক্তিকে তার নিজস্ব ফাংশনে বিমূর্ত করার একটি ভাল কারণ (কোনও ফাংশন সংজ্ঞায়িত না করে আপনার ফাংশন পয়েন্টার থাকতে পারে না)।
সুতরাং এই ল্যাম্বডাস সংশোধন করার জন্য চালু করা হয়েছিল। লাম্বডাস হ'ল ফাংশন অবজেক্টস, ফাংশন পয়েন্টার নয়। আপনি যদি ল্যাম্বডা আক্ষরিক ব্যবহার [x1, x2](y1,y2){bla}
করেন তবে কোডটি উত্পন্ন হয় যা মূলত নিম্নলিখিতটি করে:
- একটি শ্রেণী নির্ধারণ করুন যার দুটি সদস্য ভেরিয়েবল (
x1
এবং x2
) এবং একটি operator()
আর্গুমেন্ট ( y1
এবং y2
) এবং বডি সহ bla
।
- শ্রেণীর একটি উদাহরণ তৈরি করুন, সদস্য ভেরিয়েবলগুলি সেট করুন
x1
এবং ভেরিয়েবলের x2
মানগুলিতে x1
এবং x2
বর্তমানে সুযোগে।
ল্যাম্বডাস ফাংশন অবজেক্টের মতো আচরণ করে, আপনি ল্যাম্বডা ব্যবহার ব্যতীত অন্য কোনও উপায়ে ল্যাম্বডা বাস্তবায়নের জন্য উত্পন্ন শ্রেণীর অ্যাক্সেস করতে পারবেন না except ফলস্বরূপ যে কোনও ফাংশন যা ফান্টেক্টরকে আর্গুমেন্ট হিসাবে গ্রহণ করে (মূলত স্ট্যান্ডার্ড লাইব্রেরিতে কোনও নন-সি ফাংশন অর্থ) ল্যাম্বডাস গ্রহণ করবে তবে কোনও ফাংশন কেবল ফাংশন পয়েন্টার গ্রহণ করে তা গ্রহণ করবে না।