DSL को बनाने के लिए रूबी की "क्षमता" से बेहतर किस क्षेत्र में LISP का मैक्रो है


21

रूबी चमक बनाने वाली चीजों में से एक डोमेन विशिष्ट भाषाओं को बेहतर बनाने की क्षमता है, जैसे

हालांकि कोई भी मैक्रो के माध्यम से इन पुस्तकालयों को एलआईएसपी में डुप्लिकेट कर सकता है, मुझे लगता है कि रूबी का कार्यान्वयन अधिक सुरुचिपूर्ण है। बहरहाल, मुझे लगता है कि ऐसे मामले हैं कि LISP का मैक्रो रूबी से बेहतर हो सकता है, हालांकि मैं एक के बारे में नहीं सोच सकता था।

तो, रूबी की "क्षमता" की तुलना में एलआईएसपी का मैक्रो किस क्षेत्र में बेहतर है ताकि डीएसएल बनाया जा सके?

अद्यतन करें

मैंने यह पूछा है क्योंकि आधुनिक प्रोग्रामिंग लैंग्वेज एलआईएसपी विलक्षणता की ओर आ रही हैं , जैसे

  • सी मिल गया मैक्रो विस्तार पूर्वप्रक्रमक , हालांकि बहुत आदिम और त्रुटि होने का खतरा
  • C # में विशेषताएं हैं, हालांकि यह केवल पढ़ने के लिए है, प्रतिबिंब के माध्यम से उजागर किया गया है
  • पायथन ने डेकोरेटर को जोड़ा, जो फ़ंक्शन के व्यवहार को संशोधित कर सकता है (और v 3.0 के लिए वर्ग), हालांकि काफी सीमित लगता है।
  • रूबी TMTOWTDI है कि सुरुचिपूर्ण DSL बनाता है, अगर देखभाल लागू किया जाता है, लेकिन रूबी में।

मैं सोच रहा था कि क्या एलआईएसपी का मैक्रो केवल विशेष मामलों पर लागू होता है और यह कि अन्य प्रोग्रामिंग भाषा की विशेषताएं काफी शक्तिशाली हैं जो सॉफ्टवेयर विकास में आज चुनौतियों का सामना करने के लिए अमूर्तता को बढ़ा सकती हैं।


4
मुझे पूरा यकीन नहीं है कि इस पर करीबी वोट क्यों हैं। हालांकि मैं इस तरह का प्रश्न चाहता हूं ? दिलचस्प, विचार उत्तेजक और गुंजाइश काफी अच्छी तरह से परिभाषित किया गया है।
टिम पोस्ट

रूबी में कुछ इस तरह से लागू करने की कोशिश करें: meta-alternative.net/pfront.pdf
SK-logic

@ समय पोस्ट: एक समस्या यह है कि यह वास्तव में जवाब देने के लिए एक आसान सवाल नहीं है जब तक कि आप कॉमन लिस्प और रूबी दोनों को अच्छी तरह से नहीं जानते। अन्य अन्य भाषाओं के लिए काफी अज्ञानी संदर्भ है, जो शुद्धतावादियों को परेशान कर सकता है: सी / सी ++ नामक कोई भाषा नहीं है, और सी ++ का महत्वपूर्ण हिस्सा टेम्पलेट सिस्टम है, और सुझाव है कि सामान्य लिस्प की मैक्रो प्रणाली केवल विशेष मामलों पर लागू होती है। मौलिक रूप से, यह एक अच्छा सवाल है, लेकिन यह बुरी तरह से लिखा गया है और इसका जवाब देना कठिन है।
डेविड थॉर्नले

@ डेविड थॉर्नले, मैंने विशेष रूप से C \ C ++ पर पोस्ट को अपडेट किया है, और C पर जोर दिया है। कॉमन लिस्प के लिए, मैं महसूस कर रहा था कि चूंकि अन्य प्रोग्रामिंग भाषाओं में उच्च अमूर्तता है, इसलिए यह मैक्रो फीचर विशेष मामले के लिए है। मैंने सवाल पोस्ट किया, उम्मीद है कि अन्य मुझे दिखाएंगे कि सीएल का मैक्रो विशेष मामले के लिए नहीं है अभी भी एक शक्तिशाली विशेषता है।
ओनेसिमसुबाउंड 14

@OnesimusUnbound: मैं वास्तव में भाषा उदाहरणों की आपकी सूची में C ++ के टेम्प्लेट शामिल करूंगा, क्योंकि वे कम से कम सैद्धांतिक रूप से किसी भी संगणना में सक्षम हैं जो लिस्प मैक्रो सिस्टम कर सकता है। जहाँ तक लिस्प के मैक्रोज़ जाते हैं, वहां कुछ अच्छे कॉमन लिस्प कोड (वहाँ बहुत सारे एफ / ओएस लिस्प कोड हैं) को पकड़ लें, और "डिफामाक्रो" (आप केस-असंवेदनशील खोज करना चाहें) कर सकते हैं। आप शायद उनमें से एक बहुत कुछ मिल जाएगा। विचार करें कि मैक्रोज़ लिखने और सही होने के लिए फ़ंक्शंस से कठिन हैं, और आपको एहसास होगा कि उन्हें आम तौर पर उपयोगी होना चाहिए।
डेविड थॉर्नले

जवाबों:


23

लिस्प पर पढ़ें और फिर अपने लिए फैसला करें।

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


1
"लेट ओवर लैम्बडा" बहुत कुछ इसी तरह के मैदान को कवर करता है। पढ़ने की भी सिफारिश की।
जॉन आर। स्ट्रोम

But Lisp wins, hands down, at the ability to create new abstractions, and then to layer abstraction on abstraction.अब मुझे पता है क्यों। । ।
OnesimusUnbound

लिस्प के शीर्ष पर किसी भी प्रकार का सिंटैक्स प्रदान करना कोई बड़ी बात नहीं है। वास्तव में, रूबी की तुलना में बहुत आसान है, पाठक मैक्रोज़ के लिए धन्यवाद।
तर्क

1
@ एसके-तर्क: सच। हालाँकि लिस्पर्स पाठक मैक्रों से दूर भागते हैं क्योंकि एक बार जब आप उस मार्ग से नीचे जाते हैं तो यह लिस्प की तरह महसूस नहीं होता है। वास्तव में लिस्प के कुछ वेरिएंट, जैसे क्लोजर, भाषा डिजाइनर के लिए पाठक मैक्रोज़।
btilly

14

DSL संलेखन के लिए रूबी की सुविधाएं भाषा की प्रकृति को नहीं बदलती हैं। रूबी की मेटाप्रोग्रामिंग सुविधाएं स्वाभाविक रूप से रूबी सिंटैक्स और शब्दार्थ से जुड़ी होती हैं, और जो भी आप लिखते हैं उसे रूबी के ऑब्जेक्ट मॉडल में मिला देना होता है।

इसके विपरीत कि लिस्प (और स्कीम, जिनकी मैक्रो सुविधाएं भिन्न होती हैं ), जहां मैक्रो अमूर्त कार्यक्रम पर काम करते हैं। क्योंकि एक लिस्प कार्यक्रम है एक लिस्प मूल्य, एक मैक्रो एक समारोह मानचित्रण एक से दूसरे अनिवार्य रूप से मनमाने ढंग से वाक्य रचना है।

प्रभावी रूप से, एक रूबी डीएसएल अभी भी रूबी की तरह महसूस करता है, लेकिन एक लिस्प डीएसएल को लिस्प की तरह महसूस नहीं करना पड़ता है।


6
+1: LOOP एक DSL के उदाहरण के रूप में बहुत लिस्फी महसूस नहीं करता है।
फ्रैंक शीयर

2

रूबी के डीएसएलएस डीएसएल बिल्कुल नहीं हैं, और मैं उनका उपयोग करने से बिल्कुल नफरत करता हूं क्योंकि उनके प्रलेखन फ्लैट-आउट के बारे में है कि वे वास्तव में कैसे काम करते हैं। उदाहरण के लिए ActiveRecord लेते हैं। यह आपको मॉडल के बीच "घोषणा" करने की अनुमति देता है:

class Foo < ActiveRecord::Base
    has_one :bar
    has_one :baz
end

लेकिन इस "डीएसएल" की घोषणा (जैसे रूबी के classसिंटैक्स की खुद की घोषणा ) एक भयानक झूठ है जो किसी के द्वारा उजागर किया जा सकता है जो समझता है कि रूबी "डीएसएल" वास्तव में कैसे काम करती है:

class Foo < ActiveRecord::Base
    [:bar,:baz,:qux,:quux].each do |table|
        has_one table if i_feel_like_it?(table)
    end
    puts "Just for shits and giggles, and to show"
    puts "just how fucked up Ruby really is, we're gonna ask you"
    puts "which SQL table you want the Foo model to have an"
    puts "association with.\n"
    puts "Type the name of a table here: "
    has_one gets.chomp.to_sym
end

(बस कुछ भी करने की कोशिश करीब एक लिस्प के मुख्य भाग में है कि करने के लिए defclassप्रपत्र!)

जैसे ही आपके पास आपके कोडबेस में ऊपर जैसा कोड होता है, प्रोजेक्ट के प्रत्येक डेवलपर को पूरी तरह से समझना होगा कि कोड को बनाए रखने से पहले रूबी डीएसएल वास्तव में कैसे काम करती है (न कि वे जो भ्रम पैदा करती हैं)। उपलब्ध दस्तावेज़ीकरण पूरी तरह से बेकार हो जाएगा, क्योंकि वे केवल मुहावरेदार उपयोग का दस्तावेजीकरण करते हैं , जो घोषणात्मक भ्रम को बनाए रखता है।

RSpec ऊपर से भी बदतर है, क्योंकि इसमें विचित्र किनारे के मामले हैं जिन्हें डीबग करने के लिए व्यापक रिवर्स-इंजीनियरिंग की आवश्यकता होती है। (मैं एक पूरा दिन बिताया। बाहर क्यों अपने परीक्षण मामलों में से एक को छोड़ दिया जा रहा था आंकड़ा करने की कोशिश कर यह पता चला कि RSpec सभी प्रकार के परीक्षण संदर्भों है कि निष्पादित करता है के बाद कोई संदर्भ के साथ परीक्षण मामले, जिस क्रम में वे स्रोत में दिखाई देते हैं की परवाह किए बिना , क्योंकि contextविधि आपके ब्लॉक को एक अलग डेटा संरचना में रखती है , क्योंकि यह सामान्य रूप से अंदर जाएगा।)

लिस्प डीएसएल को मैक्रोज़ द्वारा कार्यान्वित किया जाता है, जो कि छोटे संकलक हैं। इस तरह से आप जो डीएसएल बना सकते हैं, वह लिस्प के मौजूदा सिंटैक्स का दुरुपयोग नहीं है। वे वास्तविक मिनी-भाषाएँ हैं जिन्हें पूरी तरह से सहज लिखा जा सकता है, क्योंकि उनके पास अपना व्याकरण हो सकता है। उदाहरण के लिए, लिस्प का LOOPमैक्रो रूबी की eachविधि की तुलना में कहीं अधिक शक्तिशाली है ।

(मुझे पता है कि आप पहले से ही एक उत्तर को स्वीकार कर चुके हैं, लेकिन हर कोई जो यह नहीं पढ़ता है वह ऑन लिस्प की संपूर्णता को पढ़ना चाहता है ।)

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