ক্লেম একটি সর্বনিম্ন স্ট্যাক-ভিত্তিক প্রোগ্রামিং ভাষা যা প্রথম শ্রেণির ফাংশনগুলির বৈশিষ্ট্যযুক্ত। আপনার উদ্দেশ্য হ'ল ক্লেম ভাষার জন্য একজন দোভাষী লিখুন। এটি এখানে উপলভ্য রেফারেন্স বাস্তবায়নের অন্তর্ভুক্ত সমস্ত উদাহরণগুলি যথাযথভাবে কার্যকর করা উচিত ।
- যথারীতি স্ট্যান্ডার্ড লুফোলস প্রয়োগ হয়।
- বাইট গণনা দ্বারা ক্ষুদ্রতম এন্ট্রি জয়।
ক্লেম ভাষা
ক্লেম হ'ল প্রথম শ্রেণির ফাংশন সহ একটি স্ট্যাক ভিত্তিক প্রোগ্রামিং ভাষা। ক্লেম শিখার সর্বোত্তম উপায় হ'ল clem
দোভাষী ছাড়াই দোভাষী চালানো । এটি ইন্টারেক্টিভ মোডে শুরু হবে, আপনাকে উপলভ্য কমান্ডগুলির সাথে খেলতে দেবে। উদাহরণস্বরূপ প্রোগ্রামগুলি পরিচালনা করতে, প্রোগ্রামটির clem example.clm
নাম যেখানে উদাহরণটি টাইপ করুন । এই সংক্ষিপ্ত টিউটোরিয়ালটি আপনাকে শুরু করার জন্য যথেষ্ট হতে হবে।
ফাংশন দুটি প্রধান শ্রেণি আছে। পারমাণবিক ফাংশন এবং যৌগিক ফাংশন। যৌগিক ফাংশন হ'ল অন্যান্য যৌগিক ফাংশন এবং পারমাণবিক ফাংশনগুলির সমন্বিত তালিকা। মনে রাখবেন যে কোনও যৌগিক ক্রিয়ায় নিজেকে ধারণ করতে পারে না।
পারমাণবিক কার্যাদি
প্রথম ধরণের পারমাণবিক ক্রিয়াটি ধ্রুবক হয় । একটি ধ্রুবক হল একটি পূর্ণসংখ্যা মান। উদাহরণস্বরূপ, -10। দোভাষী যখন একটি ধ্রুবকের মুখোমুখি হন , তখন এটি স্ট্যাকের দিকে ঠেলে দেয়। clem
এখন দৌড়াও । -10
প্রম্পটে টাইপ করুন । তোমার দেখা উচিত
> -10
001: (-10)
>
মান 001
স্ট্যাকের মধ্যে ফাংশনের অবস্থান বর্ণনা এবং (-10)
হয় ধ্রুবক আপনি শুধু প্রবেশ করে। এখন +11
প্রম্পটে প্রবেশ করুন। তোমার দেখা উচিত
> +11
002: (-10)
001: (11)
>
লক্ষ্য করুন যে (-10)
স্ট্যাকের দ্বিতীয় অবস্থানে চলে গেছে এবং (11)
এখন প্রথমটি দখল করে। এটাই স্ট্যাকের প্রকৃতি! আপনি লক্ষ্য করবেন যে -
এটি হ্রাস আদেশও। যখনই -
বা +
কোনও সংখ্যার আগে, তারা সেই সংখ্যার চিহ্নটি বোঝায়, সংশ্লিষ্ট আদেশটি নয়। অন্যান্য সমস্ত পারমাণবিক ফাংশন হ'ল কমান্ড । মোট 14 জন রয়েছে:
@ Rotate the top three functions on the stack
# Pop the function on top of the stack and push it twice
$ Swap the top two functions on top of the stack
% Pop the function on top of the stack and throw it away
/ Pop a compound function. Split off the first function, push what's left,
then push the first function.
. Pop two functions, concatenate them and push the result
+ Pop a function. If its a constant then increment it. Push it
- Pop a function. If its a constant then decrement it. Push it
< Get a character from STDIN and push it to the stack. Pushes -1 on EOF.
> Pop a function and print its ASCII character if its a constant
c Pop a function and print its value if its a constant
w Pop a function from the stack. Peek at the top of the stack. While it is
a non-zero constant, execute the function.
প্রম্পটে একটি কমান্ড টাইপ করলে কমান্ডটি কার্যকর হবে। #
প্রম্পটে টাইপ করুন (সদৃশ আদেশ) তোমার দেখা উচিত
> #
003: (-10)
002: (11)
001: (11)
>
লক্ষ্য করুন যে (11) সদৃশ হয়ে গেছে। এখন %
প্রম্পটে টাইপ করুন (ড্রপ কমান্ড) তোমার দেখা উচিত
> %
002: (-10)
001: (11)
>
স্ট্যাকের একটি কমান্ড ঠেলাঠেলি করার জন্য, কেবল বন্ধনীতে এটি বন্ধ করুন। (-)
প্রম্পটে টাইপ করুন । এটি হ্রাস অপারেটরটিকে স্ট্যাকের দিকে ঠেলে দেবে। তোমার দেখা উচিত
> (-)
003: (-10)
002: (11)
001: (-)
>
যৌগিক ফাংশন
যৌগিক ফাংশন গঠনের জন্য আপনি বন্ধনীতে একাধিক পারমাণবিক ফাংশন সংযুক্ত করতে পারেন। প্রম্পটে আপনি যখন কোনও যৌগিক ক্রিয়াকলাপ প্রবেশ করেন, তখন এটি স্ট্যাকের দিকে ধাক্কা দেওয়া হয়। ($+$)
প্রম্পটে টাইপ করুন । তোমার দেখা উচিত
> ($+$)
004: (-10)
003: (11)
002: (-)
001: ($ + $)
>
প্রযুক্তিগতভাবে, স্ট্যাকের সমস্ত কিছুই একটি যৌগিক ফাংশন। তবে, স্ট্যাকের কয়েকটি যৌগিক কার্য একটি একক পরমাণু ফাংশন নিয়ে গঠিত (যার ক্ষেত্রে আমরা তাদের সুবিধার জন্য এগুলি পারমাণবিক ক্রিয়া হিসাবে বিবেচনা করব)। স্ট্যাকের উপর যৌগিক ক্রিয়াকলাপগুলি পরিচালনা করার সময়, .
কমান্ডটি (কনটেনটেশন) প্রায়শই কার্যকর। .
এখন টাইপ করুন । তোমার দেখা উচিত
> .
003: (-10)
002: (11)
001: (- $ + $)
>
লক্ষ্য করুন যে স্ট্যাকের প্রথম এবং দ্বিতীয় ফাংশনগুলি সংশ্লেষিত হয়েছিল এবং স্ট্যাকের দ্বিতীয় ফাংশন ফলাফলের তালিকায় প্রথম আসে। স্ট্যাকের মধ্যে থাকা কোনও ক্রিয়াকলাপ সম্পাদন করতে (এটি পরমাণু বা যৌগিক হোক), আমাদের অবশ্যই w
কমান্ডটি (যখন) জারি করতে হবে । w
কমান্ড স্ট্যাক প্রথম ফাংশন পপ এবং এতক্ষণ স্ট্যাক দ্বিতীয় ফাংশন একটি নন-জিরো ধ্রুবক যেমন বারবার এটা চালানো হবে। আমরা টাইপ করলে কী হবে তা পূর্বাভাস দেওয়ার চেষ্টা করুন w
। এখন, টাইপ করুন w
। তোমার দেখা উচিত
> w
002: (1)
001: (0)
>
আপনি কি এটি প্রত্যাশা করেছিলেন? স্ট্যাকের উপরে বসা দুটি সংখ্যা যুক্ত করা হয়েছিল এবং তাদের যোগফলগুলি রয়ে গেছে। এটি আবার চেষ্টা করুন। প্রথমে আমরা শূন্যটি নামব এবং টাইপ করে একটি 10 টি চাপবো %10
। তোমার দেখা উচিত
> %10
002: (1)
001: (10)
>
এখন আমরা একটি শটে পুরো ফাংশনটি টাইপ করব, তবে %
শূন্য থেকে মুক্তি পেতে আমরা শেষে একটি অতিরিক্ত যুক্ত করব । (-$+$)w%
প্রম্পটে টাইপ করুন । তোমার দেখা উচিত
> (-$+$)w%
001: (11)
>
(দ্রষ্টব্য এই অ্যালগরিদম কেবল তখনই কাজ করে যদি স্ট্যাকের প্রথম ধ্রুবকটি ইতিবাচক হয়)।
স্ট্রিংস
স্ট্রিংগুলিও উপস্থিত রয়েছে। এগুলি বেশিরভাগ সিনট্যাকটিক চিনি, তবে বেশ কার্যকর হতে পারে। দোভাষী যখন একটি স্ট্রিংয়ের মুখোমুখি হন, তখন এটি প্রতিটি অক্ষরকে শেষ থেকে প্রথম পর্যন্ত স্ট্যাকের দিকে ঠেলে দেয়। %
পূর্ববর্তী উদাহরণ থেকে 11 টি নামানোর জন্য টাইপ করুন । এখন, 0 10 "Hi!"
প্রম্পটে টাইপ করুন। 0
একটি শূন্য টারমিনেটর ঢোকাব এবং 10
একটি নতুন লাইন অক্ষর সন্নিবেশ করা হবে। তোমার দেখা উচিত
> 0 10 "Hi!"
005: (0)
004: (10)
003: (33)
002: (105)
001: (72)
>
(>)w
স্ট্যাক থেকে অক্ষর মুদ্রণ করতে টাইপ করুন যতক্ষণ না আমরা NULL টার্মিনেটরের মুখোমুখি হই। তোমার দেখা উচিত
> (>)w
Hi!
001: (0)
>
উপসংহার
আশা করি আপনি দোভাষীর সাথে শুরু করার জন্য এটি যথেষ্ট হবে। ভাষার নকশা তুলনামূলকভাবে সোজা-এগিয়ে হওয়া উচিত। যদি কিছু মারাত্মকভাবে অস্পষ্ট থাকে তবে আমাকে জানতে দিন :) কয়েকটি জিনিস ইচ্ছাকৃতভাবে অস্পষ্ট রেখে গেছে: মানগুলি স্বাক্ষর করতে হবে এবং কমপক্ষে 16 বিট করতে হবে, সমস্ত রেফারেন্স প্রোগ্রামগুলি চালানোর জন্য স্ট্যাকটি অবশ্যই যথেষ্ট পরিমাণে বড় হওয়া উচিত। অনেকগুলি বিবরণ খোদাই করা হয়নি Many এখানে আউট কারণ একটি সম্পূর্ণ প্রস্ফুটিত ভাষার স্পেসিফিকেশন পোস্ট করার জন্য নিষিদ্ধভাবে বড় হবে (এবং আমি এখনও একটি লিখিনি: পি)। সন্দেহ হলে রেফারেন্স বাস্তবায়ন নকল করুন।