এখানে তিনটি ভাষা রয়েছে যা আপনাকে আপনার নিজস্ব অপারেটরগুলি সংজ্ঞায়িত করতে দেয়, যা আড়াই থেকে আলাদা বিভিন্ন কাজ করে! হাস্কেল এবং কোক উভয়ই এই ধরণের শেনানিগানগুলি অস্বীকার করে - তবে অন্যভাবে - যখন আগদা এই ধরণের এসোসিয়েটিভিটির মিশ্রণের অনুমতি দেয়।
প্রথমত, হাস্কেল-এ , আপনাকে কেবল এটি করার অনুমতি দেওয়া হয় না। আপনি আপনার নিজের অপারেটরগুলি সংজ্ঞায়িত করতে পারেন এবং তাদের পছন্দ (0-9) থেকে অগ্রাধিকার দিতে পারেন এবং আপনার পছন্দসইয়ের সাহচর্যতা দিতে পারেন। তবে, হাস্কেল রিপোর্ট আপনাকে মিশ্রিত মিশ্রণ থেকে নিষেধ করে :
সিনট্যাক্স ত্রুটি এড়াতে একই নজিরযুক্ত ধারাবাহিকভাবে অপরিবর্তিত অপারেটরদের উভয়কেই বাম বা ডান সহযোগী হতে হবে। [হাস্কেল ২০১০ রিপোর্ট, সিএইচ। 3]
সুতরাং, জিএইচসি-তে , আমরা যদি একই অগ্রাধিকার স্তরে একটি বাম-সাহচর্যকারী ( infixl
) অপারেটর <@
এবং ডান-অ্যাসোসিয়েটিভ অপারেটর সংজ্ঞায়িত @>
করি - তবে 0 বলি - তাহলে মূল্যায়ন x <@ y @> z
ত্রুটি দেয়
প্রাধান্য পার্সিং ত্রুটি
মিশ্রিত করা যাবে না ' <@
' [ infixl 0
] এবং ' @>
' [ infixr 0
একই পোতা এক্সপ্রেশনে]
(আসলে, আপনি অপারেটরটিকে ইনফিক্স হিসাবে ঘোষণা করতে পারেন তবে অ-সাহসী, যেমন ==
, যাতে এটি x == y == z
একটি সিনট্যাক্স ত্রুটি হয়!)
অন্যদিকে, নির্ভরশীল-টাইপিত ভাষা / উপপাদ্য প্রবাদ আগদা (যা স্বীকার করে, যথেষ্ট কম মূলধারার)। অজদার কাছে আমার জানা ভাষার যে কোনও ভাষাতে সবচেয়ে মারাত্মক সিনট্যাক্স রয়েছে, মিক্সফিক্স অপারেটরকে সমর্থন করে : স্ট্যান্ডার্ড লাইব্রেরিতে ফাংশনটি রয়েছে
if_then_else_ : ∀ {a} {A : Set a} → Bool → A → A → A
যা বলা হয়, এটি লেখা হয়
if b then t else f
আন্ডারস্কোরগুলিতে যুক্তিগুলি পূরণ করে! আমি এটি উল্লেখ করেছি কারণ এর অর্থ এটি অবিশ্বাস্যরূপে নমনীয় পার্সিং সমর্থন করতে পারে। স্বাভাবিকভাবেই, Agda এছাড়াও (তার প্রাধান্য মাত্রা উপর নির্বিচারে স্বাভাবিক সংখ্যার ব্যাপ্তি এবং 0-100 মধ্যে সাধারণত যদিও) অপরিবর্তন ঘোষণা আছে, এবং Agda করে একই প্রাধান্য কিন্তু বিভিন্ন fixities অপারেটরদের মিশ্রিত করা আপনার অনুমতি দেয়। আমি অবশ্য ডকুমেন্টেশনে এ সম্পর্কিত তথ্য খুঁজে পাচ্ছি না, তাই আমাকে পরীক্ষা-নিরীক্ষা করতে হয়েছিল।
আসুন আমাদের <@
এবং @>
উপরে থেকে পুনরায় ব্যবহার করুন । দুটি সহজ ক্ষেত্রে, আমাদের আছে
x <@ y @> z
পার্সিং হিসাবে x <@ (y @> z)
; এবং
x @> y <@ z
পার্সিং হিসাবে (x @> y) <@ z
।
আমি মনে করি যে আগদা যা করে তা হ'ল লাইনটি "বাম সংঘবদ্ধ" এবং "ডান সহযোগী" অংশগুলিতে ভাগ করে, এবং - যতক্ষণ না আমি ভুল বিষয় নিয়ে ভাবছি - ডান-অ্যাসোসিয়েটিভ অংশটি সংলগ্ন যুক্তিগুলি ধরতে "অগ্রাধিকার" পেয়েছে gets যাতে আমাদের দেয়
a <@ b <@ c @> d @> e @> f <@ g
পার্সিং হিসাবে
(((a <@ b) <@ (c @> (d @> (e @> f)))) <@ g
অথবা
যাইহোক, আমার পরীক্ষা-নিরীক্ষা সত্ত্বেও, আমি প্রথমবার এটি লিখেছিলাম বলে ভুল অনুমান করেছি, যা শিক্ষণীয় হতে পারে :-)
(এবং হাস্কেলের মতো আগদারও অ-সহযোগী অপারেটর রয়েছে, যা সঠিকভাবে পার্স ত্রুটি দেয়, সুতরাং মিশ্র সমিতিগুলির পক্ষেও একটি পার্সিং ত্রুটি হতে পারে possible)
অবশেষে, উপপাদ্য-প্রবাদ / নির্ভরশীল-টাইপযুক্ত ভাষা কোক রয়েছে , যার আগদার চেয়ে আরও নমনীয় বাক্য গঠন রয়েছে কারণ এর সিনট্যাক্স এক্সটেনশনগুলি আসলে নতুন সিনট্যাকটিক কনস্ট্রাক্টের জন্য স্পেসিফিকেশন প্রদানের পরে বাস্তবায়িত করা হয় এবং তারপরে এগুলি মূল ভাষায় পুনর্লিখন করে (অস্পষ্টভাবে ম্যাক্রোর মতো) , আমি ধরে নিচ্ছি). কক-তে, তালিকা বাক্য গঠনটি [1; 2; 3]
মানক পাঠাগার থেকে .চ্ছিক আমদানি। নতুন সিনট্যাক্সগুলি এমনকি ভেরিয়েবলকে বাঁধতে পারে!
আবারও, কক-এ, আমরা আমাদের নিজস্ব ইনফিক্স অপারেটরগুলি সংজ্ঞায়িত করতে পারি এবং তাদের অগ্রাধিকার স্তর (0-99 থেকে বেশিরভাগ থেকে) এবং এসোসিয়েটিভিটিগুলি দিতে পারি। যাইহোক, কক-এ, প্রতিটি অগ্রাধিকার স্তরের কেবলমাত্র একটি সাহচর্য থাকতে পারে । সুতরাং যদি আমরা <@
বাম- সংঘবদ্ধ হিসাবে সংজ্ঞায়িত করি এবং তারপরে @>
একই স্তরে ডান-এসোসিয়েটিভ হিসাবে সংজ্ঞায়িত করার চেষ্টা করি - বলুন, 50 - আমরা পেয়েছি
ত্রুটি: 50 স্তরটি ইতিমধ্যে বাম সংঘটিত হিসাবে ঘোষিত হয়েছে যখন এটি এখন ডান সংঘবদ্ধ হিসাবে প্রত্যাশিত
ককের বেশিরভাগ অপারেটর এমন স্তরে থাকে যা 10 দ্বারা বিভাজ্য হয়; যদি আমার মধ্যে এসোসিয়েটিভিটি সংক্রান্ত সমস্যা থাকে (এই স্তরগুলির এসোসিয়েটিভিটিগুলি বিশ্বব্যাপী) তবে আমি সাধারণত উভয় দিকের (সাধারণত আপ) একের দ্বারা স্তরটিকে ধাক্কা মেরে ফেলেছি।