কীভাবে অলস মূল্যায়ন কার্যকর করতে হয় ()


10

আমি বর্তমানে নীচের উপর ভিত্তি করে একটি এক্সপ্রেশন মূল্যায়নকারী (একক লাইন এক্সপ্রেশন, সূত্রের মতো) বাস্তবায়ন করছি:

  • প্রবেশ করা এক্সপ্রেশনটি আক্ষরিক বুলিয়ান, পূর্ণসংখ্যা, দশমিক, স্ট্রিং, ফাংশন, আইডেন্টিফায়ার (ভেরিয়েবল) আলাদা করতে টোকানাইজড
  • প্রথম বন্ধন থেকে মুক্তি পেতে অপারেটরদের একটি পোস্টফিক্সড অর্ডারে শালীন অগ্রাধিকার দিয়ে অর্ডার করার জন্য আমি শান্টিং-ইয়ার্ড অ্যালগরিদম (পরিবর্তনশীল সংখ্যক যুক্তিযুক্ত ফাংশনগুলি সামলানোর জন্য হালকাভাবে সংশোধিত) প্রয়োগ করেছি
  • আমার শান্টিং-ইয়ার্ডটি কেবল টোকেনের একটি (সিমুলেটেড) সারি তৈরি করে (একটি অ্যারের মাধ্যমে, আমার পাওয়ারবিল্ডার ক্লাসিক ভাষা বস্তুগুলি সংজ্ঞায়িত করতে পারে তবে কেবল গতিশীল অ্যারেগুলিকে স্থানীয় স্টোরেজ হিসাবে বলা যায় - সত্য তালিকা নয়, কোনও অভিধান নেই) যা আমি ক্রমানুসারে মূল্যায়ন করি একটি দিয়ে সাধারণ স্ট্যাক মেশিন

আমার মূল্যায়নকারী সুন্দরভাবে কাজ করছেন, তবে আমি এখনও একটি অনুপস্থিত if()এবং কীভাবে এগিয়ে যেতে হবে তা নিয়ে আমি ভাবছি।

আমার শান্টিং-ইয়ার্ড পোস্টফিক্সড এবং স্ট্যাক ভিত্তিক মূল্যায়ন সহ, আমি যদি if()সত্য এবং মিথ্যা অংশগুলির সাথে অন্য ফাংশন হিসাবে যুক্ত করি তবে একটিমাত্র if(true, msgbox("ok"), msgbox("not ok"))উভয় বার্তা প্রদর্শন করবে যখন আমি কেবল একটিই প্রদর্শন করতে চাই। এটি কারণ যখন আমার কোনও ফাংশনটি মূল্যায়ন করা দরকার তখন এর সমস্ত যুক্তি ইতিমধ্যে মূল্যায়ন এবং স্ট্যাকের উপর রেখে দেওয়া হয়েছে।

আপনি কি আমাকে if()অলস উপায়ে বাস্তবায়নের জন্য কিছু উপায় দিতে পারেন ?

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

সম্পাদনা করুন : কিছু সমস্যা হলেও, আমি মনে করি যে আমি আমার অভিব্যক্তির একটি গাছের উপস্থাপনা (লিনিয়ার টোকেন স্ট্রিমের পরিবর্তে একটি এএসটি) তৈরি করতে পারি, যা থেকে আমি আমার একটি বা অন্য শাখা সহজেই উপেক্ষা করতে পারি if()

উত্তর:


9

এখানে দুটি বিকল্প রয়েছে।

1) ifএকটি ফাংশন হিসাবে বাস্তবায়ন করবেন না । এটি বিশেষ শব্দার্থবিজ্ঞানের সাহায্যে একটি ভাষা বৈশিষ্ট্য তৈরি করুন। করা সহজ, তবে কম "খাঁটি" যদি আপনি চান যে সমস্ত কিছু একটি ফাংশন হতে পারে।

2) শব্দার্থক শব্দগুলি প্রয়োগ করুন, যা আরও জটিল, তবে ifএকটি ভাষার উপাদানগুলির পরিবর্তে একটি ফাংশন হিসাবে রাখার সময় সংকলক যাদুটিকে অলস মূল্যায়ন সমস্যার যত্ন নিতে দেয় । এটা এইভাবেই চলে:

ifএকটি ফাংশন যা দুটি পরামিতি নেয়, উভয়ই "নাম দ্বারা" হিসাবে ঘোষণা করা হয়। সংকলকটি যখন দেখবে যে এটি কোনও নাম-প্যারামিটারে কিছু করছে, তখন কোডটি উত্পন্ন হওয়ার জন্য পরিবর্তন করে। অভিব্যক্তিটি মূল্যায়ন এবং মানটি পাস করার পরিবর্তে এটি এমন একটি বন্ধন তৈরি করে যা অভিব্যক্তিটির মূল্যায়ন করে এবং পরিবর্তে এটি পাস করে। এবং ফাংশনের অভ্যন্তরে বাই-নাম প্যারামিটারটি চাওয়ার সময়, সংকলকটি ক্লোজারের মূল্যায়ন করার জন্য কোড উত্পন্ন করে।


আমি নিশ্চিত নই, তবে "ক্লোজার" কি "থঙ্ক" হওয়া উচিত? হুম, নাও হতে পারে; সবেমাত্র উইকিপিডিয়া পৃষ্ঠার দিকে তাকিয়েছিলেন: "থাঙ্ক একটি প্যারামিটারলেস ক্লোজার"।

আপনি যখন "নাম দ্বারা কল" বলছেন তখন আপনি বিশ্বব্যাপী উল্লেখ করছেন? বিকল্পভাবে গ্লোবাল কল-বাই-নামটি কেবল একটি ক্লোজার টাইপ বাস্তবায়ন করছে, তবে যদি ফাংশনটি কেবল 3 টি ক্লোজার নেয় এবং দুটি (শর্ত এবং তারপরে বা অন্য কোনও) মূল্যায়ন করে তবে সমস্ত কিছুই সম্পূর্ণ কল-বাই-এর মতো ক্লোজার হিসাবে স্বীকৃত হয় না not নাম শব্দার্থবিজ্ঞান
জিমি হোফা

@ ম্যাট: "থঙ্ক" শব্দটির অর্থ প্রোগ্রামিংয়ের প্রসঙ্গে আরও কয়েকটি বিষয় হতে পারে এবং আমি যখন শুনি তখন "পরামিতিবিহীন বন্ধ" প্রথমটি নয়। "বন্ধ" অনেক বেশি দ্ব্যর্থহীন।
ম্যাসন হুইলারের

1
@ জিমিহোফা: আমি যখন "নাম ধরে ডাকি" বলি, তখন আমি একটি কার্যকারিতা যুক্তি স্থাপনের একটি নির্দিষ্ট শৈলীর উল্লেখ করছি, যা alচ্ছিক হওয়া উচিত। অনেকগুলি বিদ্যমান ভাষার মতোই আপনাকে প্যারামিতি বাই-ভ্যালু বা বাই-রেফারেন্স পাস করার জন্য অনুমতি দেবে, এই দৃশ্যের জন্য আপনার নাম-দিয়ে পাস করার পছন্দ প্রয়োজন।
ম্যাসন হুইলারের

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

3

পরিবর্তে স্বাক্ষরযুক্ত ফাংশন:

object if(bool, object, object)

এটি স্বাক্ষর দিন:

object if(bool, object function(), object function())

তারপরে আপনার ifফাংশনটি শর্তের ভিত্তিতে উপযুক্ত ফাংশনটি কল করবে, কেবলমাত্র তার মধ্যে একটির মূল্যায়ন করবে।


1

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

তারপরে আপনি নিম্নলিখিতটি করতে পারেন: যদি এটি একটি আক্ষরিক বা পরিবর্তনশীল হয় (আপনার কী আছে ?, অর্থাৎ ফাংশনগুলির নাম?), এটি স্ট্যাকের উপর চাপ দিন push যদি এটি কোনও ফাংশনের অ্যাপ্লিকেশন হয় তবে এটি আলাদাভাবে সংকলন করুন এবং স্ট্যাকের উপর প্রবেশের পয়েন্টটি চাপ দিন।

কোনও প্রোগ্রামের সম্পাদন তখন স্ট্যাকের শীর্ষস্থানীয় মূল্যায়ন না হওয়া পর্যন্ত কেবল লুপিং হয় এবং কোনও ফাংশন নয়। যদি এটি মূল্যায়ন না করা হয় বা কোনও ফাংশন, কোডটিকে স্ট্যাক পয়েন্টের শীর্ষে কল করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.