একটি ভেরিয়েবল-টাইপ 'অপারেটর' সহ এতগুলি ভাষা কেন বিদ্যমান?


47

আমি এটি এইভাবে বোঝাতে চাই:

<?php
    $number1 = 5;   // (Type 'Int')
    $operator1 = +; // (Type non-existent 'Operator')
    $number2 = 5;   // (Type 'Int')
    $operator2 = *; // (Type non-existent 'Operator')
    $number3 = 8;   // (Type 'Int')

    $test = $number1 $operator1 $number2 $operator2 $number3; //5 + 5 * 8.

    var_dump($test);
?>

তবে এইভাবে:

<?php
    $number1 = 5;
    $number3 = 9;
    $operator1 = <;

    if ($number1 $operator1 $number3) { //5 < 9 (true)
        echo 'true';
    }
?>

এটি কোনও ভাষার কাছে রয়েছে বলে মনে হয় না - তারা না করার কোনও কারণ আছে কি?


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

7
@ মার্টিনম্যাট কার্যকরী ভাষাগুলি এগুলি অনেক কিছু করে।
থরবজর্ন রাভন অ্যান্ডারসন

7
হাসকেলে অপারেটররা অন্য ফাংশনের মতো ফাংশন। ধরণ (+)হয় Num a => a -> a -> aIIRC। আপনি ফাংশনগুলিও সংজ্ঞায়িত করতে পারেন যাতে সেগুলি a + bপরিবর্তে লিখে দেওয়া যায় ( পরিবর্তে (+) a b)
সারা

5
@ জেনারল্যান্ড: আপনার সম্পাদনা প্রশ্নের লক্ষ্যটিকে পুরোপুরি পরিবর্তন করেছে। কোনও ভাষার অস্তিত্ব আছে কিনা তা জিজ্ঞাসা করা থেকে কেন এত কম অস্তিত্ব রয়েছে তা জিজ্ঞাসা করা গেল। আমি মনে করি আপনার সম্পাদনার ফলে প্রচুর বিভ্রান্ত পাঠক হবে।
ব্রায়ান ওকলে

5
@ জেনারল্যান্ড: যদিও এটি সত্য, পুরোপুরি বিষয় পরিবর্তন করা কেবল বিভ্রান্তির কারণ। এটি যদি বিষয় ছাড়াই যায় তবে সম্প্রদায় এটি বন্ধ করার জন্য ভোট দেবে। উত্তরগুলির কোনওটিই (আমি এটি লেখার সময়) প্রশ্নের উত্তরটিকে লিখিত হিসাবে বোঝায় না।
ব্রায়ান ওকলে

উত্তর:


104

অপারেটরগুলি চারপাশে কিছু বিশেষ সিনট্যাক্স সহ মজাদার নামগুলিতে কেবল ফাংশন।

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

যেহেতু এই ধরনের অপারেটর-সংজ্ঞায়িত ফাংশনগুলি কেবলমাত্র পদ্ধতি, আপনি কোনও ফাংশন হিসাবে এগুলি চারপাশে পাস করতে পারেন:

# python
action = int.__add__
result = action(3, 5)
assert result == 8

অন্যান্য ভাষা আপনাকে নতুন অপারেটরগুলিকে সরাসরি ফাংশন হিসাবে সংজ্ঞায়িত করতে এবং সেগুলি ইনফিক্স আকারে ব্যবহার করতে দেয় use

-- haskell
plus a b = a + b  -- a normal function
3 `plus` 5 == 8 -- True

(+++) a b = a + b  -- a funny name made of non-letters
3 +++ 5 == 8 -- True

let action = (+)
1 `action` 3 == 4 -- True

দুর্ভাগ্যক্রমে, আমি নিশ্চিত নই যে পিএইচপি এই জাতীয় কোনওটিকে সমর্থন করে কিনা, এবং সমর্থন করলে এটি ভাল জিনিস হবে। একটি সরল ফাংশন ব্যবহার করুন, এটি এর চেয়ে বেশি পঠনযোগ্য $foo $operator $bar


2
@ ট্যাক: হ্যাঁ, এটি দুর্দান্ত এবং এমনকি অন্য ভাষায়ও সাজানো যেতে পারে :) হাস্কেল সম্পর্কে, আমি সবচেয়ে বেশি অনুপস্থিত যা হ'ল এই বিভাগটি হ'ল $অপারেটরটি হ'ল বন্ধনী (বিশেষত একাধিক নেস্টেড) অবজ্ঞা করে - তবে এটি কেবল অ-র সাথেই কাজ করতে পারে -ভরিয়াডিক ফাংশন, সুতরাং উদাহরণস্বরূপ পাইথন এবং জাভা বাদ দিয়ে। OTOH unary ফাংশন রচনাটি সুন্দরভাবে সম্পন্ন করা যায়
9000

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

4
দ্রষ্টব্য যে পাইথনের একটি মানক operatorমডিউল রয়েছে যা আপনাকে লিখতে action = operator.addদেয় এবং এটি কোনও ধরণের সংজ্ঞায়িত করে +(কেবল নয় int) এটির জন্য এটি কাজ করে ।
dan04

3
হাস্কেল +ন্যম টাইপক্লাসে কাজ করে যাতে আপনি +তৈরি করা যে কোনও নতুন ডেটা টাইপের জন্য আপনি প্রয়োগ করতে পারেন, তবে ঠিক তেমন কোনও উপায়ে যেমন কোনও ফ্যান্টাকারের জন্য এফএমএপি করুন। অপারেটরকে ওভারলোডিংয়ের অনুমতি দেওয়ার পক্ষে হাস্কেলের পক্ষে এ জাতীয় স্বাভাবিক জিনিস যে এটির অনুমতি না দেওয়ার জন্য তাদের কঠোর পরিশ্রম করতে হবে!
মার্টিন ক্যাপোডিসি

17
ওভারলোডিংয়ের কারণে লোকেরা কেন স্থির হচ্ছে তা নিশ্চিত নয়। মূল প্রশ্নটি ওভারলোডিং সম্পর্কে নয়। অপারেটরদের সম্পর্কে প্রথম-শ্রেণীর মান হিসাবে দেখে মনে হচ্ছে। লিখতে $operator1 = +এবং তারপরে এটি একটি অভিব্যক্তি ব্যবহার করার জন্য আপনাকে অপারেটর ওভারলোডিং ব্যবহার করার প্রয়োজন হবে না !
আন্দ্রেস এফ 13

16

এমন অনেকগুলি ভাষা রয়েছে যা একরকম ধাতব প্রোগ্রামের অনুমতি দেয় । বিশেষত ভাষাগুলির লিসপ পরিবার সম্পর্কে কোন উত্তর দেওয়ার কথা শুনে আমি অবাক হয়েছি ।

উইকিপিডিয়া থেকে:

প্রোগ্রামগুলি তাদের ডেটা হিসাবে গণ্য করার দক্ষতার সাথে কম্পিউটার প্রোগ্রামগুলি রচনাকে মেটাপোগ্র্যামিং ming

পরে লেখায়:

লিস্প সম্ভবত apতিহাসিক নজির এবং এর রূপকল্পের সরলতা এবং শক্তির কারণে উভয়ই রূপক সুবিধার সাথে পঞ্চম ভাষা language

লিস্প ভাষা

লিস্পে একটি দ্রুত তৈরির পরিচয় অনুসরণ করা হচ্ছে।

কোড দেখার একটি উপায় হ'ল নির্দেশের স্যুট হিসাবে: এটি করুন, তারপরে এটি করুন, তারপরে এই অন্য জিনিসটি করুন ... এটি একটি তালিকা! প্রোগ্রামটি করার জন্য জিনিসগুলির একটি তালিকা। এবং অবশ্যই আপনার লুপগুলি উপস্থাপনের জন্য তালিকার ভিতরে তালিকা থাকতে পারে ..

আমরা যদি ভালো একটি, বি, সি, ডি উপাদান সম্বলিত একটি তালিকা প্রতিনিধিত্ব: (ABCD) আমরা কিছু পেতে একটি পাতার মর্মর ফাংশন কল, যেখানে মত দেখাচ্ছে aফাংশন, এবং b, c, dআর্গুমেন্ট। আসলে যদি টিপিক্যাল হয় "হ্যালো ওয়ার্ল্ড!" প্রোগ্রাম যেমন লেখা যেতে পারে:(println "Hello World!")

অবশ্যই b, cবা dতালিকাগুলি হতে পারে যা কিছুতে মূল্যায়নও করে। নিম্নলিখিত: এর (println "I can add :" (+ 1 3) )পরে "" আমি যুক্ত করতে পারি: 4 "মুদ্রণ করবে।

সুতরাং, একটি প্রোগ্রাম নেস্টেড তালিকার একটি সিরিজ এবং প্রথম উপাদানটি একটি ফাংশন। সুসংবাদটি হ'ল আমরা তালিকাগুলি পরিচালনা করতে পারি! সুতরাং আমরা প্রোগ্রামিং ভাষাগুলিতে কারসাজি করতে পারি।

লিস্প সুবিধা

লিসপগুলি তেমন প্রোগ্রামিং ভাষা নয় যতটা প্রোগ্রামিং ভাষা তৈরির জন্য একটি সরঞ্জামকিট। একটি প্রোগ্রামেবল প্রোগ্রামিং ভাষা।

নতুন অপারেটরগুলি তৈরি করা লিসপ্সগুলিতে এটি কেবল খুব সহজ নয়, অন্য ভাষায় কিছু অপারেটর লেখা প্রায় অসম্ভব কারণ কারণ ফাংশনে যাওয়ার সময় যুক্তিগুলি মূল্যায়ন করা হয়।

উদাহরণস্বরূপ সি-এর মতো ভাষায় বলা যাক যে আপনি ifনিজে একজন অপারেটর লিখতে চান , এরকম কিছু:

my-if(condition, if-true, if-false)

my-if(false, print("I should not be printed"), print("I should be printed"))

এক্ষেত্রে উভয় যুক্তিই আর্গুমেন্টগুলির মূল্যায়নের ক্রমের উপর নির্ভর করে একটি আদেশে মূল্যায়ন ও মুদ্রণ করা হবে।

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

বাস্তব-বিশ্বের ভাষাগুলি

এখানে ঠিক কীভাবে সুযোগের বাইরে রয়েছে তা দেখানো হচ্ছে, তবে আমি আপনাকে আরও শিখতে একটি লিস্পে প্রোগ্রামিংয়ের চেষ্টা করতে উত্সাহিত করি। উদাহরণস্বরূপ আপনি এ একবার দেখতে পারেন:

  • স্কিম , একটি ছোট কোর সহ একটি পুরানো, বেশ "খাঁটি" লিস্প
  • কমন লিস্প, একটি ভাল সংহত বস্তু সিস্টেম সহ একটি বৃহত লিস্প এবং অনেকগুলি বাস্তবায়ন (এটি এএনএসআই-স্ট্যান্ডার্ডাইজড)
  • একটি টাইপ করা লিপ র‌্যাকেট
  • আমার প্রিয় ক্লোজার , উপরের উদাহরণগুলি ক্লোজার কোড ছিল। জেভিএম-তে চলছে একটি আধুনিক লিস্প। সেখানে Clojure ম্যাক্রো কিছু উদাহরণ তাই পাশাপাশি (কিন্তু এই অধিকার জায়গা থেকে শুরু নয়। আমি দেখাবে 4clojure , braveclojure বা clojure koans প্রথম))।

ওহ এবং যাইহোক, লিস্পের অর্থ LISt প্রক্রিয়াজাতকরণ।

আপনার উদাহরণ সম্পর্কে

আমি নীচের ক্লোজার ব্যবহার করে উদাহরণ দিতে যাচ্ছি:

আপনি যদি addক্লোজুরে একটি ফাংশন লিখতে পারেন তবে আপনি (defn add [a b] ...your-implementation-here... )এটির +মতো নাম লিখতে পারেন (defn + [a b] ...your-implementation-here... )। এটি প্রকৃত বাস্তবায়নে যা করা হয় তা হ'ল (ফাংশনটির মূল অংশটি আরও কিছুটা জড়িত তবে সংজ্ঞাটি মূলত আমি উপরে যেমন লিখেছি তেমন একই)।

ইনফিক্স স্বরলিপি সম্পর্কে কি? ওয়েল ক্লুজুরে একটি prefix(বা পোলিশ) স্বরলিপি ব্যবহার করে, তাই আমরা এমন একটি infix-to-prefixম্যাক্রো তৈরি করতে পারি যা উপসর্গযুক্ত কোডটিকে ক্লোজার কোডে পরিণত করে। যা আসলে আশ্চর্যজনকভাবে সহজ (এটি আসলে ক্লোজার কোয়ানসের ম্যাক্রো অনুশীলনের মধ্যে একটি)! এটি বন্যগুলিতেও$= দেখা যায়, উদাহরণস্বরূপ ইনকান্টার ম্যাক্রো দেখুন

এখানে কোয়ানদের সহজতম সংস্করণটি ব্যাখ্যা করা হয়েছে:

(defmacro infix [form]
  (list (second form) (first form) (nth form 2)))

;; takes a form (ie. some code) as parameter
;; and returns a list (ie. some other code)
;; where the first element is the second element from the original form
;; and the second element is the first element from the original form
;; and the third element is the third element from the original form (indexes start at 0)
;; example :
;; (infix (9 + 1))
;; will become (+ 9 1) which is valid Clojure code and will be executed to give 10 as a result

বিন্দুটিকে আরও চালিত করতে কিছু লিস্প উদ্ধৃতি দেয় :

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

- পল গ্রাহাম, এএনএসআই কমন লিস্প

“লিস্পে প্রোগ্রামিং করা মহাবিশ্বের আদিম বাহিনীর সাথে খেলার মতো। এটি আপনার আঙ্গুলের মাঝে বজ্রপাতের মতো অনুভূত হয়। অন্য কোনও ভাষা এমনকি কাছাকাছি বোধ করে না। "

- গ্লেন এহরিলিচ, রোড টু লিস্প


1
মনে রাখবেন যে ওপি কী জিজ্ঞাসা করছে তা সমর্থন করার জন্য মেটাপগ্রোমিং, আকর্ষণীয় হলেও এটি প্রয়োজনীয় নয়। প্রথম শ্রেণির ফাংশনগুলির জন্য সমর্থন সহ যে কোনও ভাষাই যথেষ্ট।
আন্দ্রেস এফ 13

1
ওপি-র প্রশ্নের উদাহরণ: (আসুন ((opp # '+)) (মুদ্রণ করুন (opp লাগান' (1 2))))
ক্যাস্পার ভ্যান ডান বার্গ

1
কমন লিস্পের কোন উল্লেখ নেই?
coredump

3
আমার মনে আছে ভাষা নিয়ে একটি প্যানেল আলোচনায়, কেন এপিএলে অগ্রাধিকারের কথা বলছিলেন এবং "আমি খুব কমই প্রথম বন্ধনী ব্যবহার করি না!" এবং শ্রোতাদের মধ্যে কেউ চিৎকার করে বলেছিল, "কারণ ডিক তাদের সব ব্যবহার করেছেন!"
জেডুগোস্জ

2
একটি সি ++ - স্টাইলের ভাষায়, আপনি পুনরায় ifপ্রয়োগ করতে পারেন তবে ল্যাম্বডাস দিয়ে আপনার thenএবং elseযুক্তিগুলি মোড়ানো দরকার । পিএইচপি এবং জাভাস্ক্রিপ্ট function(), সি ++ এর ল্যাম্বডাস রয়েছে এবং ল্যাম্বডাসের সাথে সিতে একটি অ্যাপল এক্সটেনশান রয়েছে ।
দামিয়ান ইয়ারিক

9

$test = $number1 $operator1 $number2 $operator2 $number3;

বেশিরভাগ ভাষাগুলির বাস্তবায়নের একটি পদক্ষেপ থাকে যেখানে কোনও পার্সার আপনার কোড বিশ্লেষণ করে এবং সেখান থেকে একটি গাছ তৈরি করে। উদাহরণস্বরূপ সুতরাং এক্সপ্রেশন 5 + 5 * 8হিসাবে বিভক্ত হবে

  +
 / \
5   *
   / \
  8   8

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

আপনি অবশ্যই এমন একটি ভাষা কল্পনা করতে পারেন যেখানে পার্সার কেবল উপরের অংশকে এক্সপ্রেশন এবং অপারেটরগুলির ক্রম হিসাবে রান করে সময় অনুসারে বাছাই এবং মূল্যায়ন করতে পারে। সম্ভবত এটির জন্য খুব বেশি অ্যাপ্লিকেশন নেই।

অনেক স্ক্রিপ্টিং ভাষা exprরানটাইমের সময় স্বেচ্ছাসেবী অভিব্যক্তির (বা কমপক্ষে স্বেচ্ছাচারিত পাটিগণিত এক্সপ্রেশন ) এর মূল্যায়নের অনুমতি দেয় । সেখানে আপনি কেবল নিজের সংখ্যা এবং অপারেটরগুলিকে একটি একক অভিব্যক্তিতে একত্রিত করতে পারেন এবং ভাষাটিকে এটি মূল্যায়ন করতে দেয়। পিএইচপি (এবং আরও অনেক) এ ফাংশন বলা হয় eval

$test = eval("$number1 $operator1 $number2 $operator2 $number3");

এমন কয়েকটি ভাষাও রয়েছে যা সংকলন সময়ে কোড উত্পন্ন করার অনুমতি দেয়। D এর mixin অভিব্যক্তি আমার মন, আমি কোথায় মনে হয় আপনার কাছে ভালো কিছু লিখতে পারে আসে

test = mixin("number1 " + operator1 + " number2 " + operator2 + "number3");

এখানে operator1এবং operator2স্ট্রিং ধ্রুবক হতে হবে যা সংকলন সময়ে পরিচিত, যেমন টেমপ্লেট পরামিতি। number1, number2এবং number3সাধারণ রানটাইম ভেরিয়েবল হিসাবে রেখে দেওয়া হয়েছিল।

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


+1 আপনার " eval()ভাষা নির্ধারণের সাথে পিএইচপিতে এটি সম্ভব" দিয়ে শুরু করা উচিত ... প্রযুক্তিগতভাবে এটি প্রশ্নে জিজ্ঞাসা করা ঠিক পছন্দসই ফলাফল সরবরাহ করে।
আর্মফুট

@ আর্মফুট: প্রশ্নটির কেন্দ্রবিন্দুটি কোথায় রয়েছে তা বলা শক্ত। শিরোনামটি "টাইপ অপারেটরের পরিবর্তনশীল" দিকটির উপর জোর দেয়, এবং evalসেই দিকটির কোনও উত্তর দেয় না, যেহেতু evalঅপারেটরগুলির জন্য কেবল স্ট্রিং থাকে are অতএব আমি বিকল্পগুলি আলোচনা শুরু করার আগে অপারেটর-টাইপড ভেরিয়েবলগুলির কারণে সমস্যা কেন ঘটবে তার একটি ব্যাখ্যা দিয়ে শুরু করেছি।
এমভিজি

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

2

Algol 68 এর ঠিক সেই বৈশিষ্ট্য ছিল। Algol 68 এ আপনার উদাহরণটি দেখতে পাবেন:

int সংখ্যা 1 = 5;                              ¢ (টাইপ 'int') ¢
অপ operator1 = int- এ ( int- এ একটি , ) একটি + + ; ¢ (অস্তিত্বহীন 'অপারেটর' টাইপ করুন) io
প্রিও অপারেটর 1 = 4;
int সংখ্যা 2 = 5;                              ¢ (টাইপ 'int') ¢
অপ operator2 = int- এ ( int- এ একটি , ) একটি * ;  ¢(অস্তিত্বহীন 'অপারেটর' টাইপ করুন) io
প্রিও অপারেটর 2 = 5;
int সংখ্যা 3 = 8;                              ¢ (টাইপ 'ইন্টার') ¢

int পরীক্ষা = সংখ্যা 1 অপারেটর 1 নম্বর 2 অপারেটর 2 নম্বর 3 ; ¢ 5 + 5 * 8. ¢

var_dump ( পরীক্ষা );

আপনার দ্বিতীয় উদাহরণটি দেখতে এটির মতো হবে:

int সংখ্যা 4 = 9;
op অপারেটর = = bool ( int a , b ) a < b ;
প্রিও অপারেটর 3 = 3;
যদি সংখ্যা 1 $ অপারেটর 3 নম্বর 4 তবে ¢ 5 <9 (সত্য) ¢
মুদ্রণ ( সত্য )
ফাই

আপনি নোট করবেন যে অপারেটর প্রতীকগুলি সংজ্ঞায়িত এবং নির্ধারিত পদ্ধতিযুক্ত সংস্থাগুলিতে অপারেশনটি পছন্দসই করে। অপারেটর এবং তাদের অপারেন্ড সমস্ত টাইপ করা হয় এবং অপারেটরদের অগ্রাধিকার দেওয়া যেতে পারে তাই মূল্যায়ন সঠিক ক্রমে ঘটবে। আপনি আরও খেয়াল করতে পারেন যে অপারেটর প্রতীক এবং একটি পরিবর্তনশীল চিহ্নের মধ্যে ফন্টিংয়ের মধ্যে কিছুটা পার্থক্য রয়েছে।

প্রকৃতপক্ষে, ভাষাটি ফন্টিং ব্যবহার করে লেখা হলেও, দিনের মেশিনগুলি হরফগুলি (কাগজের টেপ এবং খোঁচা কার্ড) পরিচালনা করতে পারেনি, এবং স্ট্রপিং ব্যবহার করা হয়েছিল। প্রোগ্রামটি সম্ভবত এটি প্রবেশ করানো হবে:

'INT' NUMBER4 = 9;
'OP' 'OPERATOR3' = 'BOOL' ('INT' A,B) A < B;
'PRIO' 'OPERATOR3' = 3;
'IF' NUMBER1 'OPERATOR3' NUMBER4 'THEN' 'C' 5 < 9 'C'
PRINT('TRUE')
'FI'

অপারেটরগুলির জন্য আপনার নিজের প্রতীকগুলি সংজ্ঞায়িত করতে পারলে আপনি ভাষা সহ আকর্ষণীয় গেম খেলতে পারেন, যা আমি বহু বছর আগে একবার শোষণ করেছি ... [2]।


তথ্যসূত্র:

[1] সিএইচ লিল্ডসি এবং এসজি ভ্যান ডার মিউলেন, উত্তর হল্যান্ড, 1971 দ্বারা অ্যালগোলের অনানুষ্ঠানিক ভূমিকা

[২] অ্যালগল Ph৮ বাক্যাংশ, আলগল BC 68 , বিসি টম্পসেট, আলগোলের অ্যাপ্লিকেশন সম্পর্কিত আন্তর্জাতিক সম্মেলন, ইউরোপ, নরুইচ, ইউনিভার্সিটি অফ ইস্ট অ্যাঞ্জেলিয়া, আন্তর্জাতিক সম্মেলন

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