चर-प्रकार 'ऑपरेटर' वाली इतनी कम भाषाएँ क्यों मौजूद हैं?


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
सामान्य तौर पर आप जो करना चाहते हैं वह सभी भाषाओं से आच्छादित होगा जो कुछ प्रकार के लंबोदा, क्लोजर या अनाम कार्यों के साथ मेटा प्रोग्रामिंग के कुछ रूप का समर्थन करता है जो इस तरह की सुविधाओं को लागू करने का सामान्य तरीका होगा। उन भाषाओं के साथ, जहाँ विधियाँ प्रथम श्रेणी के नागरिक हैं, आप उन्हें कमोबेश चर के समान उपयोग कर पाएंगे। हालांकि वास्तव में उस सरल वाक्यविन्यास का उपयोग आप यहां नहीं करते हैं क्योंकि अधिकांश ऐसी भाषाओं में यह स्पष्ट किया जाना चाहिए कि आप वास्तव में चर में संग्रहीत विधि को कॉल करना चाहते हैं।
थोरस्टेन मुलर

7
@MartinMaat कार्यात्मक भाषाएं बहुत कुछ करती हैं।
थोरबजोरन रावन एंडरसन 10

7
हैस्केल में, ऑपरेटर किसी अन्य फ़ंक्शन की तरह कार्य करते हैं। आईआईआरसी का प्रकार (+)है Num a => a -> a -> a। आप फ़ंक्शंस को परिभाषित भी कर सकते हैं ताकि उन्हें लिखा जा सके ( a + bइसके बजाय (+) a b)
sara

5
@ेंडरलैंड: आपके संपादन ने प्रश्न के लक्ष्य को पूरी तरह से बदल दिया है। यह पूछने से गया कि क्या कोई भाषा मौजूद है, यह पूछने के लिए कि कुछ मौजूद क्यों हैं। मुझे लगता है कि आपके संपादन में बहुत सारे भ्रमित पाठक होंगे।
ब्रायन ओकले

5
@ेंडरलैंड: जबकि यह सच है, विषय को पूरी तरह से बदलना केवल भ्रमित करने का काम करता है। यदि यह विषय बंद है, तो समुदाय इसे बंद करने के लिए मतदान करेगा। कोई भी उत्तर (जिस समय मैं इसे लिखता हूं) उस प्रश्न के लिखित रूप में समझ में नहीं आता।
ब्रायन ओकली

जवाबों:


104

ऑपरेटर कुछ विशेष वाक्यविन्यास के साथ मज़ेदार नामों के तहत कार्य कर रहे हैं।

कई भाषाओं में, सी ++ और पायथन के रूप में विविध, आप अपनी कक्षा के विशेष तरीकों को ओवरराइड करके ऑपरेटरों को फिर से परिभाषित कर सकते हैं। फिर मानक ऑपरेटर (जैसे +) आपके द्वारा आपूर्ति किए गए तर्क के अनुसार काम करते हैं (जैसे स्ट्रिंग्स को जोड़ना या मैट्रिस या जो कुछ भी जोड़ना)।

चूंकि ऐसे ऑपरेटर-परिभाषित कार्य केवल विधियां हैं, आप उन्हें एक समारोह के रूप में पास कर सकते हैं:

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

अन्य भाषाएं आपको नए ऑपरेटरों को फ़ंक्शंस के रूप में सीधे परिभाषित करने और उन्हें इनफ़िक्स रूप में उपयोग करने की अनुमति देती हैं।

-- 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

दुर्भाग्य से, मुझे यकीन नहीं है कि अगर PHP ऐसा कुछ भी समर्थन करता है, और यदि यह समर्थन करता है तो यह एक अच्छी बात होगी। एक सादे समारोह का उपयोग करें, यह की तुलना में अधिक पठनीय है $foo $operator $bar


2
@ टैक: हां, यह अच्छा है और यहां तक ​​कि इसे अन्य भाषाओं में भी पोर्ट किया जा सकता है :) हास्केल के बारे में, जो मुझे सबसे ज्यादा याद आ रही है, वह है यह विभाग वह $ऑपरेटर जो कोष्ठक (विशेषकर कई नेस्टेड) ​​का पालन करता है - लेकिन यह केवल गैर के साथ काम कर सकता है इस प्रकार के कार्यों को छोड़कर, उदाहरण के लिए पायथन और जावा को छोड़कर। OTOH एकात्मक कार्य रचना अच्छी तरह से किया जा सकता है
9000

6
मैं कभी भी ओवरलोडिंग करने वाले ऑपरेटर का प्रशंसक नहीं रहा क्योंकि हाँ, एक ऑपरेटर केवल विशेष वाक्य रचना के साथ एक फ़ंक्शन है, लेकिन एक निहित अनुबंध है जो आमतौर पर ऑपरेटरों के साथ जाता है जो फ़ंक्शन के साथ नहीं जाते हैं। "+" उदाहरण के लिए, कुछ अपेक्षाएं हैं - ऑपरेटर पूर्वता, कम्यूटिविटी, आदि - और उन उम्मीदों के खिलाफ जाना लोगों को भ्रमित करने और बग पैदा करने के लिए एक निश्चित मार्ग है। एक कारण यह है कि, हालांकि मुझे जावास्क्रिप्ट पसंद है, मैं पसंद करूँगा कि वे जोड़-घटाव के लिए + के बीच अंतर करें। पर्ल के पास वहीं था।
fool4jesus

4
ध्यान दें कि पायथन में एक मानक operatorमॉड्यूल है जो आपको लिखने देगा action = operator.add, और यह किसी भी प्रकार के लिए काम करेगा जो परिभाषित करता है +(न कि सिर्फ int)।
dan04

3
हास्केल में +ईएमयू टाइपकास्ट पर काम करता है ताकि आप अपने द्वारा बनाए गए +किसी भी नए डेटा प्रकार के लिए कार्यान्वित कर सकें , लेकिन उसी तरह जैसे आप किसी और चीज के लिए करते हैं जैसे किसी फ़नकार के लिए फ़ैप। यह हास्केल के लिए एक स्वाभाविक फिट है कि ऑपरेटर को ओवरलोडिंग की अनुमति देने के लिए उन्हें इसे अनुमति नहीं देने के लिए कड़ी मेहनत करनी होगी!
मार्टिन कैपोडिसी

17
यह सुनिश्चित नहीं है कि लोग ओवरलोडिंग पर क्यों ठीक हो रहे हैं। मूल प्रश्न ओवरलोडिंग के बारे में नहीं है। यह मुझे प्रथम श्रेणी के मान के रूप में ऑपरेटरों के बारे में लगता है। लिखने के लिए $operator1 = +और फिर इसे एक अभिव्यक्ति का उपयोग करने के लिए आपको ऑपरेटर को ओवरलोडिंग का उपयोग करने की आवश्यकता नहीं है !
एंड्रेस एफ।

16

बहुत सी भाषाएं हैं जो किसी प्रकार के मेटाप्रोग्रामिंग की अनुमति देती हैं । विशेष रूप से, मैं भाषाओं के लिस्प परिवार के बारे में बात करते हुए कोई जवाब नहीं देखकर हैरान हूं ।

विकिपीडिया से:

Metaprogramming कंप्यूटर प्रोग्राम को प्रोग्राम को उनके डेटा के रूप में व्यवहार करने की क्षमता के साथ लिखती है।

पाठ में बाद में:

लिस्प संभवतः ऐतिहासिक रूप से अपनी पूर्ववर्तीता की वजह से और इसके मेट्रोपोग्रामिंग की सादगी और शक्ति दोनों के कारण, सर्वोत्कृष्ट भाषा है।

लिस्प भाषाएं

लिस्प के लिए एक त्वरित बनाया इंट्रो निम्नानुसार है।

कोड को देखने का एक तरीका निर्देशों के एक सूट के रूप में है: ऐसा करें, फिर ऐसा करें, फिर यह दूसरी बात करें ... यह एक सूची है! कार्यक्रम करने के लिए चीजों की एक सूची। और निश्चित रूप से आप छोरों का प्रतिनिधित्व करने के लिए सूचियों के अंदर सूचियां हो सकती हैं और इसी तरह ।।

अगर हम इस तरह एक, ख, ग, घ तत्वों से युक्त एक सूची प्रतिनिधित्व करते हैं: (एबीसीडी) हम कुछ पाने कि एक लिस्प समारोह कॉल है, जहां की तरह दिखता aसमारोह है, और b, c, dतर्क हैं। यदि वास्तव में विशिष्ट "हैलो वर्ल्ड!" कार्यक्रम को इस तरह लिखा जा सकता है:(println "Hello World!")

बेशक b, cया dकुछ के रूप में अच्छी तरह से मूल्यांकन करने वाली सूची हो सकती है। निम्नलिखित: (println "I can add :" (+ 1 3) )फिर "मैं जोड़ सकता हूं: 4" प्रिंट करूंगा।

तो, एक प्रोग्राम नेस्टेड सूचियों का एक सीरी है, और पहला तत्व एक फ़ंक्शन है। अच्छी खबर यह है कि हम सूचियों में हेरफेर कर सकते हैं! तो हम प्रोग्रामिंग भाषाओं में हेरफेर कर सकते हैं।

लिस्प लाभ

लिस्प्स इतनी प्रोग्रामिंग लैंग्वेज नहीं हैं, जितनी प्रोग्रामिंग लैंग्वेज बनाने के टूलकिट हैं। एक प्रोग्राम करने योग्य प्रोग्रामिंग भाषा।

नए ऑपरेटरों को बनाने के लिए लिसप्स में यह न केवल बहुत आसान है, कुछ ऑपरेटरों को अन्य भाषाओं में लिखना भी लगभग असंभव है क्योंकि फ़ंक्शन के पास जाने पर तर्कों का मूल्यांकन किया जाता है।

उदाहरण के लिए C- जैसी भाषा में मान लें कि आप अपने आप को एक ifऑपरेटर लिखना चाहते हैं , जैसे कि:

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

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

इस मामले में दोनों तर्कों का मूल्यांकन और मुद्रित किया जाएगा, जो तर्कों के मूल्यांकन के आदेश के आश्रित हैं।

लिस्प्स में, एक ऑपरेटर लिखना (हम इसे मैक्रो कहते हैं) और एक फ़ंक्शन लिखना उसी चीज़ के बारे में है और उसी तरह से उपयोग किया जाता है। मैक्रो के लिए तर्क के रूप में पारित होने से पहले किसी मैक्रो के मापदंडों का मूल्यांकन नहीं किया जा रहा है। यह ifउपरोक्त जैसे कुछ ऑपरेटरों को लिखने में सक्षम होने के लिए आवश्यक है ।

वास्तविक दुनिया की भाषाएँ

यह दिखाते हुए कि वास्तव में यह कितना छोटा है, लेकिन मैं आपको और अधिक सीखने के लिए एक लिस्प में प्रोग्रामिंग की कोशिश करने के लिए प्रोत्साहित करता हूं। उदाहरण के लिए आप पर एक नज़र डाल सकते हैं:

  • स्कीम , एक पुरानी, ​​काफी "शुद्ध" लिस्प एक छोटे से कोर के साथ
  • सामान्य लिस्प, एक अच्छी तरह से एकीकृत वस्तु प्रणाली के साथ एक बड़ा लिस्प, और कई कार्यान्वयन (यह एएनएसआई-मानकीकृत है)
  • रैकेट एक टाइप लिस्प
  • क्लोजर मेरे पसंदीदा, ऊपर के उदाहरण क्लोजर कोड थे। जेवीएम पर चलने वाला एक आधुनिक लिस्प। एसओ के साथ ही क्लोजर मैक्रोज़ के कुछ उदाहरण हैं (लेकिन यह शुरू करने के लिए सही जगह नहीं है। मैं पहले 4clojure , braveclojure या clojure koans पहले देखूंगा )।

ओह और वैसे, लिस्प का अर्थ है एलआईएसटी प्रोसेसिंग।

अपने उदाहरणों के बारे में

मैं नीचे दिए गए क्लोजर का उपयोग करके उदाहरण देने जा रहा हूं:

यदि आप addक्लोजर में एक फ़ंक्शन लिख सकते हैं (defn add [a b] ...your-implementation-here... ), तो आप इसे +ऐसा नाम दे सकते हैं (defn + [a b] ...your-implementation-here... )। यह वास्तव में वास्तविक कार्यान्वयन में किया जाता है (फ़ंक्शन का शरीर थोड़ा अधिक शामिल है लेकिन परिभाषा मूल रूप से समान है जैसा कि मैंने ऊपर लिखा है)।

Infix संकेतन के बारे में क्या? अच्छी तरह से क्लोजर एक 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
ध्यान दें कि दिलचस्प है, जबकि दिलचस्प है कि ओपी के बारे में क्या पूछ रहा है का समर्थन करने के लिए आवश्यक नहीं है। प्रथम श्रेणी के कार्यों के लिए समर्थन के साथ कोई भी भाषा पर्याप्त है।
एंड्रेस एफ।

1
ओपी के प्रश्न का उदाहरण: (लेट ((opp # '+)) (प्रिंट (opp लागू करें' (1 2))))
कैस्पर वैन den बर्ग

1
कॉमन लिस्प का कोई जिक्र नहीं?
coredump

3
मुझे याद है कि भाषाओं के बारे में एक पैनल चर्चा में, केन एपीएल में पूर्वता के बारे में बात कर रहा था और निष्कर्ष निकाला कि "मैं शायद ही कभी कोष्ठक का उपयोग करता हूँ!" और दर्शकों में से कोई चिल्लाता है, "ऐसा इसलिए है क्योंकि डिक ने उन सभी का उपयोग किया है!"
17:30 पर JDługosz

2
C ++ - शैली की भाषा में, आप इसे पुन: लागू कर सकते हैं if, लेकिन आपको लैम्ब्डा के साथ thenऔर elseतर्कों को लपेटना होगा । PHP और जावास्क्रिप्ट के पास function(), C ++ में लैम्ब्डा है, और लैम्ब्डा के साथ C में एक Apple एक्सटेंशन मौजूद है ।
दामियन येरिक

9

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

अधिकांश भाषाओं के कार्यान्वयन में एक कदम होता है जहां एक पार्सर आपके कोड का विश्लेषण करता है और उसमें से एक पेड़ बनाता है। इसलिए उदाहरण के लिए अभिव्यक्ति 5 + 5 * 8को इस तरह देखा जाएगा

  +
 / \
5   *
   / \
  8   8

पूर्ववर्ती के बारे में संकलक के ज्ञान के लिए धन्यवाद। यदि आपने इसे ऑपरेटरों के स्थान पर चर दिया है, तो यह कोड को चलाने से पहले संचालन के उचित क्रम को नहीं जानता होगा। अधिकांश कार्यान्वयनों के लिए जो एक गंभीर समस्या होगी, इसलिए अधिकांश भाषाएं इसकी अनुमति नहीं देती हैं।

आप निश्चित रूप से एक ऐसी भाषा की कल्पना कर सकते हैं, जहां पार्सर सिर्फ अभिव्यक्तियों और संचालकों के अनुक्रम के रूप में उपरोक्त को पार्स करता है, क्रमबद्ध तरीके से और मूल्यांकन किया जाता है। संभवत: इसके लिए बस इतना ही आवेदन नहीं है।

कई स्क्रिप्टिंग भाषाएं exprरनटाइम के दौरान मनमाने ढंग से अभिव्यक्ति (या कम से कम मनमाना अंकगणितीय अभिव्यक्तियों के रूप में ) के मूल्यांकन की अनुमति देती हैं । वहां आप सिर्फ एक अभिव्यक्ति में अपने संख्याओं और ऑपरेटरों को जोड़ सकते हैं और भाषा का मूल्यांकन कर सकते हैं। PHP में (और कई अन्य) उस फ़ंक्शन को कहा जाता है eval

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

ऐसी भाषाएं भी हैं जो संकलन समय पर कोड पीढ़ी के लिए अनुमति देती हैं। डी में mixin अभिव्यक्ति मेरे मन, मैं कहाँ लगता है कि आप की तरह कुछ लिख सकता है की बात आती है

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

यहाँ operator1और operator2स्ट्रिंग स्थिरांक बनना होगा जो संकलित समय पर जाना जाता है, जैसे टेम्पलेट पैरामीटर। number1, number2और number3सामान्य क्रम चर के रूप में छोड़ दिया गया।

अन्य उत्तरों ने पहले से ही विभिन्न तरीकों पर चर्चा की कि कैसे एक ऑपरेटर और एक फ़ंक्शन कम या ज्यादा समान हैं, जो भाषा पर निर्भर करता है। लेकिन आमतौर पर एक बिल्टइन इनफ़िक्स ऑपरेटर प्रतीक जैसे +और नामांकित कॉल जैसे के बीच एक वाक्यात्मक अंतर होता है operator1। मैं उन अन्य उत्तरों का विवरण छोड़ दूँगा।


+1 आपको " eval()भाषा निर्माण के साथ PHP में संभव है" से शुरू करना चाहिए ... तकनीकी रूप से यह प्रश्न में पूछे गए वांछित परिणाम प्रदान करता है।
आर्मफूट

@Armfoot: यह बताना मुश्किल है कि प्रश्न का फोकस कहाँ है। शीर्षक "प्रकार ऑपरेटर के चर" पहलू पर जोर देता है, और evalउस पहलू का जवाब नहीं देता है, क्योंकि evalऑपरेटरों के लिए बस तार हैं। इसलिए मैंने एक स्पष्टीकरण के साथ शुरू किया कि क्यों ऑपरेटर-टाइप किए गए चर समस्या पैदा करेंगे, इससे पहले कि मैं विकल्पों पर चर्चा करना शुरू कर दूं।
MvG

मैं आपकी बातों को समझता हूं, लेकिन इस बात पर विचार करें कि सब कुछ एक स्ट्रिंग में भरकर, आप मूल रूप से यह समझ रहे हैं कि चर प्रकार अब प्रासंगिक नहीं हैं (चूंकि PHP का उपयोग उदाहरण के लिए किया गया था, यह प्रश्न का ध्यान केंद्रित लगता है), और अंत में, आप उन्हें उसी तरह रख सकते हैं जैसे कि उन चर में से कुछ समान परिणाम प्राप्त करते समय "टाइप ऑपरेटर" के थे ... इसीलिए मेरा मानना ​​है कि आपका सुझाव प्रश्न का सबसे सटीक उत्तर प्रदान करता है।
आर्मफूट

2

Algol 68 में वास्तव में यह सुविधा थी। अल्गोल 68 में आपका उदाहरण इस प्रकार होगा:

int नंबर 1 = 5;                              ¢ (प्रकार 'इंट') ¢
सेशन operator1 = int ( पूर्णांक एक , ) एक + ; ¢ (टाइप न के बराबर 'ऑपरेटर') ¢
prio operator1 = 4;
int संख्या 2 = 5;                              ¢ (प्रकार 'इंट') ¢
सेशन operator2 = int ( पूर्णांक एक , ) एक * ;  ¢(टाइप न के बराबर 'ऑपरेटर') ¢
prio operator2 = 5;
int संख्या 3 = 8;                              ¢ (प्रकार 'इंट') ¢

int test = नंबर 1 ऑपरेटर 1 नंबर 2 ऑपरेटर 2 नंबर 3 ; ¢ 5 + 5 * 8. ¢

var_dump ( परीक्षण );

आपका दूसरा उदाहरण इस तरह दिखेगा:

int संख्या 4 = 9;
सेशन operator3 = bool ( पूर्णांक एक , ) एक < ;
prio operator3 = 3;
यदि संख्या 1 $ operator3 number4 तो ¢ 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]।


संदर्भ:

[१] अलिगोल ६inds का अनौपचारिक परिचय CHLindsey और SG van der Meulen, North Holland, १ ९ Introduction१ द्वारा

[२] अल्गोल ६ Ph वाक्यांश, अल्जोल ६ol, बीसी टॉम्पसेट में कंपाइलर लेखन में सहायता करने का एक उपकरण , अल्जोल ६, के अनुप्रयोग पर अंतर्राष्ट्रीय सम्मेलन, पूर्वी एंग्लिया, नॉर्विच, यूके, १ ९ 1976६ में विश्वविद्यालय

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.