2008-10-02 11 views
6

को नियंत्रित करने के लिए रूबी डीएसएल में सुधार करने में मदद की ज़रूरत है। मैं एक Arduino परियोजना को नियंत्रित करने के लिए रूबी में एक डीएसएल लिख रहा हूं; Bardino। यह एक बार बंदर है जो पेय पदार्थों की सेवा के लिए नियंत्रित सॉफ्टवेयर होगा। Arduino Arduino को बताने के लिए सीरियल बंदरगाह के माध्यम से आदेश लेता है कि किस पंप चालू करने के लिए और कितनी देर तक।एक Arduino नियंत्रित पेय डिस्पेंसर (बार बंदर)

वर्तमान में यह एक नुस्खा पढ़ता है (नीचे देखें) और इसे वापस प्रिंट करता है। सीरियल संचार के लिए कोड को अभी भी कुछ अन्य विचारों के साथ-साथ नीचे उल्लिखित कुछ अन्य विचारों में भी काम करने की आवश्यकता है।

यह मेरा पहला डीएसएल है और मैं पिछले उदाहरण से काम कर रहा हूं, इसलिए यह किनारों के चारों ओर बहुत मोटा है। कोई भी आलोचना, कोड सुधार (रूबी डीएसएल सर्वोत्तम प्रथाओं या मुहावरे के लिए कोई अच्छा संदर्भ है?) या किसी भी सामान्य टिप्पणी।

मैं वर्तमान में डीएसएल का एक मोटा मसौदा तो एक पेय नुस्खा निम्नलिखित (Github link) की तरह लग रहा है:

desc "Simple glass of water" 
recipe "water" do 
    ingredients(
    "Water" => 2.ounces 
) 
end 

यह बदले में व्याख्या की और वर्तमान में निम्नलिखित (Github link) के साथ परिणाम है:

[[email protected] barduino-tender]$ ruby barduino-tender.rb examples/water.rb 
Preparing: Simple glass of water 

Ingredients: 
Water: 2 ounces 

यह डीएसएल के लिए एक अच्छी शुरुआत है, हालांकि, मुझे लगता है कि इसे थोड़ा बेहतर कार्यान्वित किया जा सकता है। मेरे विचार नीचे दिए गए थे:

  1. परिभाषित करना कि सामग्री के नाम और उस संख्या पंप से कनेक्ट होने वाले "सामग्री" क्या हैं। शायद एक हैश का उपयोग कर? अवयव = {"पानी" => 1, "वोदका" => 2}। इस तरह, जब एक घटक का व्याख्या किया जाता है तो यह या तो ए) सीरियल बंदरगाह पर पंप संख्या भेज सकता है, इसके बाद Arduino के लिए औंस की संख्या के बाद औंस की संख्या बी) उपयोगकर्ता को बताएं कि घटक मौजूद नहीं है और निरस्त कर दिया गया है इसलिए कुछ भी नहीं है c) यदि वे बदल गए हैं तो आसानी से बदलने या नई सामग्री जोड़ने की क्षमता है।
  2. नुस्खा बनाना कम कोड जैसा दिखता है, जो एक डीएसएल का मुख्य उद्देश्य है, शायद एक नुस्खा निर्माता बना सकता है? उपयोगकर्ता को एक पेय नाम, सामग्री शामिल करने और कितना करने के लिए संकेत देने के लिए उपलब्ध सामग्री का उपयोग करना?

गीथब प्रोजेक्ट here है, फोर्क से मुक्त महसूस करें और पुल अनुरोध करें, या अन्य उपयोगकर्ताओं के लिए यहां अपने कोड सुझाव और उदाहरण पोस्ट करें। और यदि आप सभी उत्सुक हैं, रूबी आर्डिनो विकास ढांचे का उपयोग करते हुए Arduino कोड here है।

अद्यतन

मैं संशोधित और एक नुस्खा के लिए ओरियन एडवर्ड्स सुझाव प्रतिबिंबित करने के लिए एक सा साफ बातें। यह अब निम्न की तरह दिखता है।

description 'Screwdriver' do 
    serve_in 'Highball Glass' 
    ingredients do 
    2.ounces :vodka 
    5.ounces :orange_juice 
    end 
end 

मैंने एक हैश भी जोड़ा (कुंजी घटक और मूल्य जिस पंप संख्या को लगाया गया है)। मुझे लगता है कि यह बहुत प्रगति प्रदान की है। मैं अब के लिए किसी और सुझाव के लिए खुला प्रश्न छोड़ दूंगा, लेकिन आखिरकार ओरियन के जवाब का चयन करूंगा। अद्यतन डीएसएल कोड here है।

+0

मिश्रण में कुछ छद्म कोड जोड़ने के लिए। सामग्री में घटक के लिए {if ingredient.exists? serial.send (pump_number) प्रतीक्षा करें 1 सेकंड serial.send (राशि) Arduino से ठीक के लिए प्रतीक्षा करें अगले घटक को जारी रखने के लिए} – mwilliams

उत्तर

5

कार्यान्वयन विवरण (या अपने GitHub लिंक) में देख के बिना, मैं इस तरह एक डीएसएल लिखने की कोशिश करेंगे:

(यहाँ से चोरी: http://supercocktails.com/1310/Long-Island-Iced-Tea-)

describe "Long Island Iced Tea" do 
    serve_in 'Highball Glass' 

    ingredients do 
    half.ounce.of :vodka 
    half.ounce.of :tequila 
    half.ounce.of :light_rum 
    half.ounce.of :gin 
    1.dash.of :coca_cola 
    #ignoring lemon peel as how can a robot peel a lemon? 
    end 

    steps do 
    add :vodka, :tequila, :light_rum, :gin 
    stir :gently 
    add :coca_cola 
    end 
end 

आशा है कि मदद करता है!

+0

आप 0.5.ounces.of: vodka डाल सकते हैं यदि आपको ऐसा लगे, तो मुझे बस ' आधा 'अधिक पठनीय होने के लिए –

+0

उस टिप के लिए धन्यवाद, यह वास्तव में _a lot_ अधिक पठनीय है और मैं अगले संशोधन में तदनुसार समायोजित करूंगा। – mwilliams

1

ओरियन का डीएसएल बहुत अच्छा लग रहा है। केवल परिवर्तन मैं संभवतः से आप "अद्यतन" कोड सुझाव देंगे

  1. recipe साथ description बदलें है। यह एक और वर्णनात्मक शब्द
  2. चूंकि सामग्री और क्रियाओं के सेट को ठीक किया गया है, इसलिए प्रतीकों के बजाय सामग्री को बाध्य करें I.e आपके पास vodka = :vodka कुछ जगह परिभाषित है। यह कहना आसान है कि

    मिश्रण के बजाय वोदका, जिन और ट्रिपल_सेक # मिश्रण करें: वोदका,: जिन और: triple_sec।

वैसे भी मामूली नाइट है।

+1

मैं व्यक्तिगत रूप से चर के लिए बाध्यकारी सामग्री से असहमत हूं, क्योंकि अच्छी तरह से, चर अलग-अलग करने के लिए डिज़ाइन किए गए हैं। एक चर के लिए बाध्यकारी अंतर्निहित डेवलपर "बताता है"। वास्तव में 'पनीर' होने के लिए 'वोदका' को फिर से बाध्य करने की अनुमति नहीं दी जानी चाहिए। –

+0

'recipe_for' के साथ 'वर्णन' को बदलने या समान के साथ सहमत होने के बावजूद –

3

आप नुस्खा और अधिक प्राकृतिक, क्यों नहीं देखना चाहते हैं (एक ही नुस्खा ओरियन Ewards इस्तेमाल किया, धन्यवाद से!):

Recipe for Long Island Iced Tea #1 
Ingredients: 
    1/2 oz Vodka 
    1/2 oz Tequila 
    1/2 oz Light Rum 
    1/2 oz Gin 
    1 Dash Coca-Cola 
    # ignored Twist of Lemon Peel (or Lime) 

फिर मिश्रण करने के लिए Treetop जोड़ें। आपके पास नियम हो सकते हैं जैसे:

grammar Cocktail 
    rule cocktail 
    title ingredients 
    end 

    rule title 
    'Recipe for' S text:(.*) EOF 
    end 

    rule ingredients 
    ingredient+ 
    end 

    rule ingredient 
    qty S liquid 
    end 
# ... 
end 

जो ट्रीटॉप कंपाइलर एक अच्छा रूबी मॉड्यूल में बदल जाएगा। फिर:

parser = CocktailParser.new 
r = parser.parse(recipe)