লিস্পের মতো সিনট্যাক্স এক্সটেনশন প্রক্রিয়া [বন্ধ] সহ প্রোগ্রামিং ভাষাগুলি


20

আমার কাছে লিস্পের সীমাবদ্ধ জ্ঞান আছে (আমার ফ্রি সময়ে কিছুটা শেখার চেষ্টা করা) তবে আমি যতদূর বুঝতে পেরেছি লিস্প ম্যাক্রোগুলি তাদের লিস্পে বর্ণিত করে নতুন ভাষার গঠন এবং বাক্য গঠন প্রবর্তন করতে দেয়। এর অর্থ হ'ল লিসপ সংকলক / দোভাষীকে পরিবর্তন না করে একটি নতুন কনস্ট্রাক্ট লাইব্রেরি হিসাবে যুক্ত করা যেতে পারে।

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

লিস্প পরিবারের বাইরের কি অন্যান্য প্রোগ্রামিং ভাষা রয়েছে (যেমন প্রচলিত লিস্প, স্কিম, ক্লোজার (?), র‌্যাকেট (?) ইত্যাদি) যা ভাষার ভিতরেই ভাষার প্রসারিত করার অনুরূপ সম্ভাবনা দেয়?

সম্পাদনা

দয়া করে বর্ধিত আলোচনা এড়ান এবং আপনার উত্তরগুলিতে সুনির্দিষ্ট হন। প্রোগ্রামিং ল্যাঙ্গুয়েজের দীর্ঘ তালিকার পরিবর্তে যা কোনও না কোনও উপায়ে প্রসারিত হতে পারে, আমি একটি ধারণাগত দৃষ্টিকোণ থেকে বুঝতে চাই যে এক্সটেনশন প্রক্রিয়া হিসাবে লিসপ ম্যাক্রোসের সাথে কী নির্দিষ্ট, এবং কোন-লিস্প প্রোগ্রামিং ভাষাগুলি কিছু ধারণা দেয় এটা তাদের কাছাকাছি।


6
নিয়মিত ম্যাক্রোর পাশাপাশি লিস্পের আরও একটি কৌশল রয়েছে। "রিডার ম্যাক্রোস" পার্সার সিনট্যাক্সটিকে রানটাইমগুলিতে ক্যাপচার এবং প্রসারিত করার অনুমতি দেয়, সুতরাং এমনকি ভাষার মূল টোকেন কাঠামোও নিয়ন্ত্রণাধীন।
ডিডিয়ার

@ ডিডিয়ার: ধন্যবাদ, আমি সে সম্পর্কে জানতাম না: আমার পাঠ্য তালিকায় আরও একটি বিষয় যুক্ত করা উচিত।
জর্জিও

আমি রুবি metaprogramming এটি পূরণ করতে পারেন বাজি চাই।
রিগ

1
আপনার প্রশ্নটি পরস্পরবিরোধী, প্রথমে আপনি একটি তালিকার জন্য জিজ্ঞাসা করুন, তারপরে আপনি ধারণাগত তথ্য চেয়েছেন, এটি কোনটি ???

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

উত্তর:


19

স্কেলা এটিও সম্ভব করে তোলে (আসলে এটি সচেতনভাবে নতুন ভাষা নির্মাণ এবং এমনকি ডিএসএল সম্পূর্ণরূপে সংজ্ঞায়িত করার জন্য তৈরি করা হয়েছিল)।

ক্রিয়ামূলক ভাষায় প্রচলিত উচ্চতর অর্ডার ফাংশন, ল্যাম্বডাস এবং তরকারী ছাড়াও এখানে এই * সক্ষম করতে এখানে কিছু বিশেষ ভাষা বৈশিষ্ট্য রয়েছে:

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

    val file = new File("example.txt")
    
    withPrintWriter(file) {
      writer => writer.println("this line is a function call parameter")
    }
    

    যেখানে withPrintWriterদুটি প্যারামিটারের তালিকা সহ একটি সরল পদ্ধতি রয়েছে যেখানে উভয়ই একক প্যারামিটার রয়েছে

  • নাম অনুসারে পরামিতি আপনাকে ল্যাম্বডাসে খালি প্যারামিটার তালিকা বাদ দিতে দেয়, আপনাকে myAssert(() => x > 3)সংক্ষিপ্ত আকারে কলগুলি লেখার অনুমতি দেয়myAssert(x > 3)

ডিএসএল-এর উদাহরণ তৈরির বিষয়ে অধ্যায় ১১- তে বিস্তারিত আলোচনা করা হয়েছে বিনামূল্যে বই প্রোগ্রামিং স্কেলার স্ক্যালায় ডোমেন-নির্দিষ্ট ভাষাগুলি

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


1
+1: আকর্ষণীয়। এর অর্থ কি সিনট্যাক্সটি প্রসারিত করার জন্য আমি নতুন ক্লাস সংজ্ঞায়িত করতে পারি এবং সেই পদ্ধতির স্বাক্ষরগুলি বাই-প্রোডাক্ট হিসাবে নতুন সিনট্যাক্স সরবরাহ করবে?
জর্জিও

@ জর্জিও, মূলত হ্যাঁ
পিটার টারিক

লিঙ্কগুলি আর কাজ করে না।
নাট গ্লেন

13

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

এখানে একটি মডিউলও রয়েছে যা পার্লকে কোড চালানোর অনুমতি দেয় যা দেখে মনে হয় এটি পাইথনে লেখা হয়েছিল।

পার্লের মধ্যে এটির জন্য আরও আধুনিক পদ্ধতি হ'ল ফিল্টার :: সরল ( পার্ল 5 এর মূল মডিউলগুলির মধ্যে একটি) ব্যবহার করা।

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

এটি এবং অন্যান্য বিকল্পগুলির জন্য আরও ডকুমেন্টেশনগুলি পারফিল্টারে উপস্থিত রয়েছে ।


13

Haskell,

হাস্কেলের "টেম্পলেট হাস্কেল" পাশাপাশি "কোয়াসিকোটেশন" রয়েছে:

http://www.haskell.org/haskellwiki/Template_Haskell

http://www.haskell.org/haskellwiki/Quasiquotation

এই বৈশিষ্ট্যগুলি ব্যবহারকারীকে সাধারণ উপকরণের বাইরে ভাষার সিনট্যাক্সে নাটকীয়ভাবে যুক্ত করতে দেয়। এগুলি সংকলনের সময়ও সমাধান করা হয়েছে, যা আমি মনে করি (অবশ্যই কমপক্ষে সংকলিত ভাষার জন্য) [1] a

আমি সি-এর মতো ভাষার উপর একটি উন্নত প্যাটার্ন ম্যাচার তৈরি করার আগে একবার হাসকেলে কোয়াসিকোটেশন ব্যবহার করেছি:

moveSegment :: [Token] -> Maybe (SegPath, SegPath, [Token])
moveSegment [hc| HC_Move_Segment(@s, @s); | s1 s2 ts |] = Just (mkPath s1, mkPath s2, ts)
moveSegment _ = Nothing

[1] নীচের বাক্যটি সিনট্যাক্স এক্সটেনশন হিসাবে যোগ্যতা অর্জন করেছে: runFeature "some complicated grammar enclosed in a string to be evaluated at runtime"অবশ্যই কোনটি ক্র্যাপের লোড।


3
হাস্কেলের অন্যান্য বৈশিষ্ট্যও রয়েছে যা কাস্টম সিনট্যাক্সের জন্য প্রয়োজনীয়ভাবে অনুমতি দেয় যেমন আপনার নিজস্ব অপারেটর তৈরি করা বা ল্যাম্বদা ফাংশনগুলির সাথে স্বয়ংক্রিয় কার্ভিং তৈরিকরণ (উদাহরণস্বরূপ এর সাধারণ ব্যবহার বিবেচনা করুন forM)।
Xion

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

1
"অন্যটি সিনট্যাক্স এক্সটেনশন হিসাবে নিম্নলিখিত হিসাবে যোগ্যতা অর্জন করেছে ...": খুব ভাল পয়েন্ট।
জর্জিও

12

Tcl এর এক্সটেনসিবল সিনট্যাক্স সমর্থন করার দীর্ঘ ইতিহাস রয়েছে। উদাহরণস্বরূপ, এখানে একটি লুপের প্রয়োগ যা কার্ডিনালগুলি, তাদের স্কোয়ারগুলি এবং তাদের কিউবগুলিতে তিনটি ভেরিয়েবল (বন্ধ না হওয়া পর্যন্ত) পুনরাবৃত্তি করে:

proc loopCard23 {cardinalVar squareVar cubeVar body} {
    upvar 1 $cardinalVar cardinal $squareVar square $cubeVar cube

    # We borrow a 'for' loop for the implementation...
    for {set cardinal 0} true {incr cardinal} {
        set square [expr {$cardinal ** 2}]
        set cube [expr {$cardinal ** 3}]

        uplevel 1 $body
    }
}

এটি তখন এভাবে ব্যবহার করা হবে:

loopCard23 a b c {
    puts "got triplet: $a, $b, $c"
    if {$c > 400} {
        break
    }
}

এই ধরণের কৌশলটি টিসিএল প্রোগ্রামিংয়ে ব্যাপকভাবে ব্যবহৃত হয় এবং এটি স্পষ্টভাবে করার মূল কীটি হ'ল upvarএবং uplevelকমান্ডগুলি ( upvarস্থানীয় uplevelস্ক্রিনে অন্য একটি স্কোপে একটি নামযুক্ত ভেরিয়েবলকে আবদ্ধ করে, এবং অন্য স্কোপে স্ক্রিপ্ট চালায়: উভয় ক্ষেত্রেই, 1ইঙ্গিত দেয় যে প্রশ্নের সুযোগটি কলারের)) এটি কোডেও প্রচুর ব্যবহৃত হয় যা দম্পতিরা ডেটাবেসযুক্ত (ফলাফলের জন্য প্রতিটি সারির জন্য কিছু কোড চালাচ্ছে), জিইআইআইয়ের জন্য টাকায় (ইভেন্টগুলিতে কলব্যাক বাঁধানোর জন্য) ইত্যাদি etc.

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


10

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

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

গুরুত্বপূর্ণ সাধারণ বৈশিষ্ট্যটি হ'ল তারা আপনাকে সেই ভাষা রচনাগুলি সংজ্ঞায়িত করতে দেয় যা ভাষা দ্বারা প্রকাশিত বৈশিষ্ট্যগুলি ব্যবহার করে বিল্ট-ইনগুলিও কাজ করে। এই বৈশিষ্ট্যটির জন্য সহায়তার ডিগ্রি পৃথক:

  • অনেক বয়স্ক ভাষায় বিল্ট দেওয়া মতো কাজগুলির sin(), round()ইত্যাদি, আপনার নিজের বাস্তবায়ন কোন ভাবেই ছাড়া।
  • সি ++ সীমাবদ্ধ সমর্থন সরবরাহ করে। উদাহরণ হিসেবে বলা যায় কিছু বিল্ট-ইন কাস্ট মত কীওয়ার্ড ( static_cast<target_type>(input), dynamic_cast<>(), const_cast<>(), reinterpret_cast<>()) টেমপ্লেট ফাংশন, যা বিভিন্ন ধরনের বুস্ট ব্যবহারসমূহ ব্যবহার emulated করা যেতে পারে lexical_cast<>(), polymorphic_cast<>(), any_cast<>(), ....
  • জাভা (বিল্ট-ইন করেছেন নিয়ন্ত্রণ কাঠামো for(;;){}, while(){}, if(){}else{}, do{}while(), synchronized(){}, strictfp{}) এবং যাক না আপনি আপনার নিজের নির্ধারণ করুন। পরিবর্তে স্ক্যালাল একটি বিমূর্ত সিনট্যাক্স সংজ্ঞায়িত করে যা আপনাকে সুবিধাজনক নিয়ন্ত্রণ-কাঠামোর মতো সিনট্যাক্স ব্যবহার করে ফাংশনগুলি কল করতে দেয় এবং লাইব্রেরিগুলি নতুন নিয়ন্ত্রণ কাঠামোকে কার্যকরভাবে সংজ্ঞায়িত করতে এটি ব্যবহার করে (যেমন react{}অভিনেতাদের লাইব্রেরিতে)।

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


2
ভুল। পাতার মর্মর নেই আসলে আপনি একটি নতুন বাক্য গঠন একেবারে কোন ধরনের যোগ করার জন্য অনুমতি দেয়। এই উদাহরণের মতো: মেটা- বিকল্প বিকল্প //ffront.pdf - এটি একটি লিস্প ম্যাক্রো ছাড়া কিছুই নয়।
এসকে-যুক্তি

এটি বিশেষত ডিএসএল তৈরির জন্য ডিজাইন করা ভাষায় প্রয়োগ করা হয়েছে বলে মনে হয় । অবশ্যই আপনি লিস্প পরিবারে এমন একটি ভাষা তৈরি করতে পারেন যা এই জাতীয় বৈশিষ্ট্যগুলি সরবরাহ করে; আমি বোঝাতে চাইছি যে বৈশিষ্ট্যটি মূলত ব্যবহৃত লিপস (উদাঃ স্কিম) সমর্থিত কোনও মূল লিস্প ধারণা নয়। স্পষ্ট করতে সম্পাদিত।
যান্ত্রিক শামুক

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

এবং, স্কিমটি সাধারণ লিস্পের চেয়ে আলাদা নয়, আরআরআরএস থেকে আনুষ্ঠানিকভাবে শুরু হয় এবং অনানুষ্ঠানিকভাবে বয়সীদের জন্য, যেহেতু এটি একটি (define-macro ...)সমতুল্য সরবরাহ করে, যা অভ্যন্তরীণভাবে কোনও ধরণের পার্সিং ব্যবহার করতে পারে।
এসকে-যুক্তি

8

রেবোল আপনার বর্ণনা মতো প্রায় শোনাচ্ছে তবে কিছুটা পাশের দিকে।

নির্দিষ্ট সিনট্যাক্স সংজ্ঞায়িত করার পরিবর্তে, রেবলের সমস্ত কিছুই একটি ফাংশন কল - কোনও কীওয়ার্ড নেই। (হ্যাঁ, আপনি নতুন সংজ্ঞা দিতে পারেন ifএবং whileযদি আপনি সত্যিকার অর্থে ইচ্ছা করেন)। উদাহরণস্বরূপ, এটি একটি ifবিবৃতি:

if now/time < 12:00 [print "Morning"]

ifএকটি ফাংশন যা 2 টি আর্গুমেন্ট গ্রহণ করে: একটি শর্ত এবং একটি ব্লক। যদি অবস্থাটি সত্য হয় তবে ব্লকটি মূল্যায়ন করা হয়। বেশিরভাগ ভাষার মতো মনে হচ্ছে, তাই না? ঠিক আছে, ব্লকটি একটি ডেটা কাঠামো, এটি কোডের মধ্যেই সীমাবদ্ধ নয় - উদাহরণস্বরূপ, এটি একটি ব্লকের একটি ব্লক এবং "কোড হ'ল ডেটা" এর নমনীয়তার একটি দ্রুত উদাহরণ:

SomeArray: [ [foo "One"] [bar "Two"] [baz "Three"] ]
foreach action SomeArray [action/1: 'print] ; Change the data
if now/time < 12:00 SomeArray/2 ; Use the data as code - right now, if now/time < 12:00 [print "Two"]

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


7

রুবির একটি যথেষ্ট নমনীয় বাক্য গঠন রয়েছে, আমি মনে করি এটি "ভাষার মধ্যেই ভাষা প্রসারিত করার" একটি উপায়।

একটি উদাহরণ রেক । এটা তোলে রুবি লেখা, এটা রুবি, কিন্তু এটা দেখে মনে হচ্ছে করা

কিছু সম্ভাবনা যাচাই করতে আপনি রুবি এবং রূপক ক্রম কীওয়ার্ডগুলি সন্ধান করতে পারেন ।


13
"নমনীয় সিনট্যাক্স" "এক্সটেনসিবল সিনট্যাক্স" থেকে খুব আলাদা। রুবিতে প্রোগ্রাম করার পরে অনেক দিন হয়েছে, তবে রাক দেখতে অনেকটা বিল্ট-ইন সিনট্যাক্সের ব্যবহারের মতো মনে হচ্ছে। অন্য কথায়, এটি একটি অ-উদাহরণ।
থমাস এডিং

2
এটা কি ডিগ্রির বিষয় নয়, সদয় নয়? আপনি এমন একটি "এক্সটেনসিবল সিনট্যাক্স" ভাষার মধ্যে কীভাবে পার্থক্য করবেন যা এর সিনট্যাক্সের কিছু দিক অন্যকে নয়, এবং একটি "নমনীয় সিনট্যাক্স" ভাষার মধ্যে প্রসারিত করতে পারে?
আসন্ন ঝড়

1
যদি লাইনটি অস্পষ্ট হয়, তবে আসুন লাইনের পিছনে চাপ দিন যাতে সি এক্সটেনসিবল সিনট্যাক্স সমর্থন করে।
থমাস এডিং

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

যে কোনও ট্যুরিজিং সম্পূর্ণ ভাষায় ফাইল তৈরির প্রক্রিয়া করতে সক্ষম হওয়া উচিত। সিনট্যাক্সের নমনীয়তা এটি কতটা চ্যালেঞ্জ হবে তার বাইরে ফ্যাক্টর নয়।
রিগ

7

আপনি যেভাবে কথা বলছেন সিনট্যাক্সটি প্রসারিত করা আপনাকে ডোমেন নির্দিষ্ট ভাষা তৈরি করতে দেয় সুতরাং আপনার প্রশ্নটির পুনঃব্যবহারের সবচেয়ে কার্যকর উপায় হ'ল, অন্য কোন ভাষায় ডোমেন নির্দিষ্ট ভাষার জন্য ভাল সমর্থন রয়েছে?

রুবির খুব নমনীয় সিনট্যাক্স রয়েছে এবং রেকের মতো অনেকগুলি ডিএসএল এখানে বেড়েছে। গ্রোভির মধ্যে সেই মঙ্গলভাব রয়েছে। এটিতে এটিএস ট্রান্সফর্মগুলিও অন্তর্ভুক্ত রয়েছে যা লিস্প ম্যাক্রোগুলির সাথে আরও সরাসরি অভিন্ন।

আর, স্ট্যাটিস্টিকাল কম্পিউটিংয়ের ভাষা, ফাংশনগুলিকে তাদের যুক্তিগুলি নির্মূল করতে দেয়। এটি রিগ্রেশন সূত্র নির্দিষ্ট করার জন্য ডিএসএল তৈরি করতে এটি ব্যবহার করে। উদাহরণ স্বরূপ:

y ~ a + b

মানে "y এর মানগুলিতে কে 0 + কে 1 * এ + কে 2 * বি ফর্মের একটি লাইন ফিট করুন" "

y ~ a * b

"" y এর মানগুলিতে কে 0 + কে 1 * এ + কে 2 * বি + কে 3 * এ * বি ফর্মের একটি লাইন ফিট করুন "

ইত্যাদি।


2
গ্রুভির এএসটি রূপান্তরগুলি লিস্প বা ক্লোজার ম্যাক্রোগুলির তুলনায় খুব ভার্জোজ। উদাহরণস্বরূপ 20+ লাইন গ্রোভির উদাহরণ গ্রোভির কোডেহস.অর্গ / গ্লোবাল + এএসটি + ট্রান্সফর্মেশনগুলিতে ক্লোজারে একটি সংক্ষিপ্ত রেখা হিসাবে পুনরায় লেখা যেতে পারে, যেমন `(এটি (প্রিন্টলন ~ বার্তা))। কেবল এটিই নয় তবে আপনাকে জারটি সংকলন করতে হবে না, মেটাটাটা লিখতে হবে না বা সেই গ্রুভি পৃষ্ঠায় অন্য কোনও জিনিস।
ভোরগ ভ্যান গির

7

রূপান্তর হ'ল অন্য একটি-অ-লম্পি মেটাপোগ্র্যামিং ভাষা। এবং কিছুটা হলেও, সি ++ও যোগ্যতা অর্জন করে।

যুক্তিযুক্তভাবে, মেটাওক্যামল লিস্প থেকে বেশ দূরে। সিনট্যাক্স এক্সটেনসিবিলিটির সম্পূর্ণ ভিন্ন স্টাইলের জন্য, তবে এখনও বেশ শক্তিশালী, ক্যামেলপি 4একবার দেখুন

লিম্প -স্টাইলের রূপকবিদ্যার সাথে নিমার হ'ল আর একটি এক্সটেনসিবল ভাষা, যদিও এটি স্কালার মতো ভাষার কাছাকাছি।

এবং, স্কেলা নিজেই খুব শীঘ্রই এ জাতীয় ভাষাতে পরিণত হবে

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

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


আপনার স্কালা লিঙ্কটি স্পষ্টতই বলেছে যে প্রস্তাবিত ম্যাক্রোগুলি "স্কালার সিনট্যাক্স পরিবর্তন করতে পারে না"। (আকর্ষণীয়, এটি প্রস্তাব এবং সি / সি ++
প্রিপ্রোসেসর

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

"আমি এমনকি প্লেইন সি দিয়ে এটি করেছি": এটি কীভাবে সম্ভব?
জর্জিও

@ জর্জিও, অবশ্যই আমি একটি সংকলক পরিবর্তন করেছি (যুক্ত ম্যাক্রোগুলি এবং একটি বর্ধিত মডিউল সংকলন, যা সি এর জন্য আসলে বেশ স্বাভাবিক)।
এসকে-যুক্তি

এএসটিতে প্রবেশের প্রয়োজনীয়তা কেন?
এলিয়ট গোরোকভস্কি

6

প্রোলোগ নতুন অপারেটরগুলি সংজ্ঞায়িত করতে দেয় যা একই নামের যৌগিক পদগুলিতে অনুবাদ করা হয়। উদাহরণস্বরূপ, এটি একটি has_catঅপারেটরকে সংজ্ঞায়িত করে এবং কোনও তালিকায় এটম রয়েছে কিনা তা যাচাই করার জন্য এটি একটি প্রিডিকেট হিসাবে সংজ্ঞায়িত করে cat:

:- op(500, xf, has_cat).
X has_cat :- member(cat, X).

?- [apple, cat, orange] has_cat.
true ;
false.

xfমানে যে has_catএকটি পোস্টসাফিক্স অপারেটর হয়; ব্যবহার করে fxএটি একটি উপসর্গ অপারেটর হিসাবে তৈরি করবে, এবং xfxদুটি যুক্তি গ্রহণ করে এটি একটি ইনফিক্স অপারেটর হিসাবে তৈরি করবে। প্রোলগ-এ অপারেটর নির্ধারণ সম্পর্কে আরও তথ্যের জন্য এই লিঙ্কটি দেখুন Check


5

টেক্সটি তালিকা থেকে পুরোপুরি অনুপস্থিত। আপনি সব জানেন, তাই না? এটি দেখতে এমন কিছু দেখাচ্ছে:

Some {\it ``interesting''} example.

... ব্যতীত আপনি বাক্যবিহীন সিনট্যাক্সটিকে নতুন করে সংজ্ঞায়িত করতে পারেন। ভাষার প্রতিটি (!) টোকেনকে একটি নতুন অর্থ নির্ধারণ করা যেতে পারে। কনটেক্সট একটি ম্যাক্রো প্যাকেজ যা বক্র ধনুর্বন্ধনী সঙ্গে কোঁকড়া ধনুর্বন্ধনী প্রতিস্থাপন করেছে:

Some \it[``interesting''] example.

আরও সাধারণ ম্যাক্রো প্যাকেজ ল্যাটেক্সও ভাষাটিকে তার লক্ষ্যের জন্য নতুনভাবে সংজ্ঞায়িত করে, যেমন \begin{environment}…\end{environment}বাক্য গঠন যুক্ত করে ।

কিন্তু এটি সেখানে থামে না। প্রযুক্তিগতভাবে, আপনি নিম্নোক্তগুলি পার্স করার জন্য টোকেনকে ঠিক নতুন সংজ্ঞা দিতে পারেন:

Some <it>“interesting”</it> example.

হ্যাঁ, একেবারে সম্ভব কিছু প্যাকেজ ছোট ডোমেন-নির্দিষ্ট ভাষা সংজ্ঞায়িত করতে এটি ব্যবহার করে। উদাহরণস্বরূপ, টিকজেড প্যাকেজ প্রযুক্তিগত অঙ্কনের জন্য একটি সংক্ষিপ্ত বাক্য গঠন নির্ধারণ করে, যা নিম্নলিখিতটির অনুমতি দেয়:

\foreach \angle in {0, 30, ..., 330} 
  \draw[line width=1pt] (\angle:0.82cm) -- (\angle:1cm);

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

for word in [Some interesting example.]:
    if word == interesting:
        it(word)
    else:
        word

5

বু আপনাকে সিনট্যাকটিক ম্যাক্রোগুলির মাধ্যমে সংকলন-সময়ে প্রচুর পরিমাণে কাস্টোমাইজ করতে দেয়।

বু-র একটি "এক্সটেনসিবল কম্পাইলার পাইপলাইন" রয়েছে। তার অর্থ সংকলক পাইপলাইন চলাকালীন যেকোন সময়ে আপনার কোডকে এএসটি রূপান্তর করতে কল করতে পারে। যেমন আপনি জানেন, জাভার জেনেরিকস বা সি # এর লিনকের মতো জিনিসগুলি সংকলনের সময় কেবল সিনট্যাক্স রূপান্তর, তাই এটি বেশ শক্তিশালী।

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

লিস্পের তুলনায় ডাউনসাইডগুলি হ'ল:

  • একটি এসটি-র সাথে কাজ করা এস-এক্সপ্রেশন দিয়ে কাজ করার মতো মার্জিত নয়
  • যেহেতু ম্যাক্রোটি সংকলনের সময় অনুরোধ করা হয়েছে তাই এটি রানটাইম ডেটাতে অ্যাক্সেস পায় না।

উদাহরণস্বরূপ, আপনি নতুন নিয়ন্ত্রণ কাঠামোটি এভাবে প্রয়োগ করতে পারেন:

macro repeatLines(repeatCount as int, lines as string*):
    for line in lines:
        yield [| print $line * $repeatCount |]

ব্যবহার:

repeatLines 2, "foo", "bar"

যা এরপরে সংকলনকালে এমন কিছুর কাছে অনুবাদ হয়:

print "foo" * 2
print "bar" * 2

(দুর্ভাগ্যক্রমে, বু-র অনলাইন ডকুমেন্টেশন সর্বদা আশাহীনভাবে পুরানো এবং এমনকি এর মতো উন্নত জিনিসগুলিও কভার করে না I আমার জানা ভাষার জন্য সেরা ডকুমেন্টেশনটি এই বইটি: http://www.manning.com/rahien/ )


1
এই বৈশিষ্ট্যটির ওয়েব ডকুমেন্টেশনটি বর্তমানে ভেঙে গেছে এবং আমি নিজেই বুউ লিখি না, তবে আমি ভেবেছিলাম এটি যদি অবহেলা করা হয় তবে এটি দুঃখজনক হবে। আমি মোডের প্রতিক্রিয়াটির প্রশংসা করি এবং আমি কীভাবে আমার অতিরিক্ত সময় নিখরচায় তথ্য অবদান সম্পর্কে যাব তা পুনর্বিবেচনা করব।
ড্যান

4

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

fuzzy[a_ && b_]      := Min[fuzzy[a], fuzzy[b]]
fuzzy[a_ || b_]      := Max[fuzzy[a], fuzzy[b]]
fuzzy[!a_]           := 1-fuzzy[a]
If[fuzzy[a_], b_,c_] := fuzzy[a] * fuzzy[b] + fuzzy[!a] * fuzzy[c]

এটি পূর্বনির্ধারিত লজিকাল অপারেটরগুলির জন্য মূল্যায়নকে ওভাররাইড করে &&, || ,! এবং অন্তর্নির্মিত Ifধারা।

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

myIf[True, then_, else_] := then
myIf[False, then_, else_] := else
SetAttributes[myIf, HoldRest]

SetAttributes[..., HoldRest] মূল্যায়নকারীকে বলে যে এটি প্যাটার্ন মিলে যাওয়ার আগে প্রথম যুক্তির মূল্যায়ন করা উচিত, তবে প্যাটার্নটি ম্যাচ করে এবং প্রতিস্থাপন না করা পর্যন্ত বিশ্রামের জন্য মূল্যায়ন রাখা উচিত।

এটি গাণিতিক স্ট্যান্ডার্ড লাইব্রেরির অভ্যন্তরে ব্যাপকভাবে ব্যবহৃত হয় উদাহরণস্বরূপ এমন একটি ক্রিয়া সংজ্ঞায়িত করতে Dযা কোনও অভিব্যক্তি গ্রহণ করে এবং এর প্রতীকী ডেরিভেটিভের মূল্যায়ন করে।


3

ধাতুয়া একটি ভাষা এবং লুয়ার সাথে সামঞ্জস্যপূর্ণ একটি সংকলক যা এটি সরবরাহ করে।

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

  • ভাষার এক্সটেনশনের একটি সেট, সমস্ত নিয়মিত ধাতুয়া ম্যাক্রো হিসাবে প্রয়োগ করা হয়।

লিস্পের সাথে পার্থক্য:

  • বিকাশকারীদের যখন তারা একটি লিখছেন না তখন তারা ম্যাক্রোগুলিকে বিরক্ত করবেন না: যখন আমরা ম্যাক্রো লিখছি না তখন ভাষার 95% সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের পক্ষে সবচেয়ে উপযুক্ত হওয়া উচিত।
  • বিকাশকারীদের ভাষার সম্মেলনগুলি অনুসরণ করতে উত্সাহিত করুন: কেবলমাত্র "সেরা অনুশীলনগুলি" দিয়ে কেউই শোনেন না, এমন একটি এপিআই প্রদান করে যা মেটালুয়া পথে জিনিস লিখতে সহজ করে তোলে। সংস্থাগুলি দ্বারা পাঠযোগ্যতার চেয়ে সহ বিকাশকারীদের পাঠযোগ্যতা অর্জন করা আরও গুরুত্বপূর্ণ এবং আরও কঠিন এবং এর জন্য, সম্মানের সম্মিলিত সম্মেলনের একটি সাধারণ সেট করা অনেক সহায়তা করে।
  • তবুও হ্যান্ডেল করতে ইচ্ছুক সমস্ত শক্তি সরবরাহ করুন। লুয়া বা মেটালুয়া উভয়ই বাধ্যতামূলক দাসত্ব এবং শৃঙ্খলার মধ্যে নেই, তাই আপনি কী করছেন তা যদি আপনি জানেন তবে ভাষাটি আপনার পথে আসবে না।
  • আকর্ষণীয় কিছু ঘটলে তা সুস্পষ্ট করুন: সমস্ত মেটা-ক্রিয়াকলাপ + {...} এবং - {... between এর মধ্যে ঘটে এবং নিয়মিত কোড থেকে চাক্ষুষভাবে আটকে যায়।

প্রয়োগের একটি উদাহরণ হ'ল এমএল-জাতীয় প্যাটার্ন ম্যাচিংয়ের প্রয়োগ implementation

আরও দেখুন: http://lua-users.org/wiki/MetaLua


যদিও লুয়া আসলেই লিস্প নয় তবে আপনার "পার্থক্যের" তালিকাটি বেশ সন্দেহজনক (একমাত্র প্রাসঙ্গিক আইটেমটিই শেষটি)) এবং অবশ্যই লিস্প সম্প্রদায় 95% সময় ম্যাক্রোগুলি লেখার / ব্যবহার করা উচিত নয় এমন কান্ডের সাথে একমত হবে না - লিস্প ওয়ে 95% সময় ম্যাক্রোর শীর্ষে, ডিএসএল ব্যবহার এবং লেখার মতো কিছু দিকে ঝুঁকছে of অবশ্যই।
এসকে-যুক্তি

2

আপনি যদি প্রসারণযোগ্য ভাষা খুঁজছেন তবে আপনার স্মার্টটাকটি একবার দেখে নেওয়া উচিত।

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

আপনি ছোট-ছোট অ্যাপ্লিকেশনগুলিতে এককভাবে লিখবেন না, পরিবর্তে আপনি ভাষা-পরিবেশকে প্রসারিত করুন।

মুষ্টিমেয় সংস্থান এবং তথ্যের জন্য http://www.world.st/ দেখুন ।

আমি ফারোকে স্মার্টটাক বিশ্বে প্রবেশের উপভাষা হিসাবে সুপারিশ করতে চাই: http://pharo-project.org

আশা করি এটি সাহায্য করেছে!


1
আকর্ষণীয় মনে হচ্ছে।
থমাস এডিং

1

এমন সরঞ্জাম রয়েছে যা স্ক্র্যাচ থেকে পুরো সংকলকটি না লিখে কাস্টম ভাষা তৈরি করতে দেয় allow উদাহরণস্বরূপ রয়েছে স্পোফ্যাক্স , যা একটি কোড ট্রান্সফর্মেশন সরঞ্জাম: আপনি ইনপুট ব্যাকরণ এবং রূপান্তর বিধি রেখেছিলেন (খুব উচ্চ স্তরের ঘোষণামূলক উপায়ে লেখা) এবং তারপরে আপনি জাভা উত্স কোড তৈরি করতে পারেন (বা অন্য ভাষা, যদি আপনি যথেষ্ট যত্ন নেন) আপনার নকশা করা একটি কাস্টম ভাষা থেকে।

সুতরাং, ভাষার এক্সের ব্যাকরণ নেওয়া, ভাষার এক্সের ব্যাকরণ নির্ধারণ করা (আপনার কাস্টম এক্সটেনশনগুলির সাথে এক্স) এবং রূপান্তর এক্স '→ এক্স' করা যাবে এবং স্পোফ্যাক্স একটি সংকলক এক্স '→ এক্স তৈরি করবে।

বর্তমানে, যদি আমি সঠিকভাবে বুঝতে পারি, তবে সি # সমর্থন বিকাশের সাথে (বা তাই শুনেছি) জাভা জন্য সেরা সমর্থন। এই কৌশলটি স্থির ব্যাকরণ (যেহেতু সম্ভবত পার্ল নয় ) সহ যে কোনও ভাষায় প্রয়োগ করা যেতে পারে ।


1

চতুর্থ আরেকটি ভাষা যা অত্যন্ত বর্ধনযোগ্য। অনেকগুলি ফোর্থ বাস্তবায়নে এসেম্বলার বা সি-তে লেখা একটি ছোট কার্নেল থাকে, তবে বাকী ভাষাটি ফোরথেই লেখা হয়।

এছাড়াও স্ট্যাক-ভিত্তিক কয়েকটি ভাষা রয়েছে যা ফোর্থ দ্বারা অনুপ্রাণিত হয় এবং এই বৈশিষ্ট্যটি ভাগ করে, যেমন ফ্যাক্টর


0

Funge-98

Funge-98 এর ফিঙ্গারপ্রিন্ট বৈশিষ্ট্যটি ভাষার সম্পূর্ণ সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের সম্পূর্ণ পুনর্গঠনের অনুমতি দেওয়ার জন্য করা যেতে পারে। তবে কেবলমাত্র যদি বাস্তবায়নকারী কোনও ফিঙ্গারপ্রিন্ট মেকানিজম সরবরাহ করে যা ব্যবহারকারীকে প্রোগ্রামাগুলিভাবে ল্যাঙ্গেজ পরিবর্তন করতে দেয় (এটি তাত্ত্বিকভাবে সাধারণ ফানজ -৯৯ সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের মধ্যে প্রয়োগ করা সম্ভব)। যদি তা হয় তবে কেউ বাকী ফাইলটি (বা ফাইলের যে কোনও অংশই হোক না কেন) সি ++ বা লিস্প (বা তিনি যা চান) হিসাবে কাজ করতে পারেন।

http://quadium.net/funge/spec98.html#Fingerprints


আপনি আপনার পূর্ববর্তী উত্তরের পরিবর্তে কেন আলাদাভাবে পোস্ট করলেন ?
gnat

1
কারণ হাস্কেলের সাথে ফাংয়ের কোনও সম্পর্ক নেই।
থমাস এডিং

-1

আপনি যা সন্ধান করছেন তা পেতে আপনার সত্যিকারের সেই প্রথম বন্ধনী এবং বাক্য গঠনের অভাব দরকার। কয়েকটি বাক্য গঠন ভিত্তিক ভাষা কাছে আসতে পারে তবে এটি সত্যিকারের ম্যাক্রোর মতো একই জিনিস নয়।

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