Benötigen Sie Hilfe bei einem Arduino gesteuert Getränkespender (bar Affe) ein Ruby-DSL Verbesserung für die Steuerung

StackOverflow https://stackoverflow.com/questions/164095

Frage

Ich bin einen DSL in Ruby schreibe ein Arduino-Projekt zu steuern, ich arbeite; Bardino. Es ist eine Bar Affe, der Software zu dienen Getränke gesteuert werden. Der Arduino nimmt Befehle über die serielle Schnittstelle des Arduino zu sagen, was und wie lange drehen Pumpen.

Es liest zur Zeit ein Rezept (siehe unten) und druckt es wieder heraus. Der Code für die serielle Kommunikation noch in sowie einige andere Ideen gearbeitet werden müssen, die ich weiter unten erwähnt haben.

Dies ist mein erster DSL und ich arbeite von einem vorherigen Beispiel aus, so dass es an den Rand sehr rau ist. Jegliche Kritik, Code-Verbesserungen (sind es gute Referenzen für Ruby DSL Best Practices oder Idiome?) Oder jede allgemeine Anmerkungen.

Im Moment habe ich einen groben Entwurf des DSL so ein Getränk Rezept sieht wie folgt aus ( Github Link ):

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

Dies wiederum interpretiert und führt derzeit mit dem folgenden ( Github Link ):

[mwilliams@Danzig barduino-tender]$ ruby barduino-tender.rb examples/water.rb
Preparing: Simple glass of water

Ingredients:
 Water: 2 ounces

Dies ist ein guter Start für den DSL ist aber ich denke, es ist ein wenig besser umgesetzt werden könnte. Einige Ideen, die ich hatte unter:

  1. definieren, was „Zutaten“ zur Verfügung, den Namen des Inhaltsstoffen verwendet und die Anzahl Pumpe, die es angeschlossen ist. Vielleicht mit einem Hash? Zutaten = { "Wasser" => 1 "Wodka" => 2}. Auf diese Weise, wenn eine Zutat interpretiert wird, kann sie entweder a) durch die Anzahl der Unzen für das Arduino b verzichtet folgte die Pumpennummer über die serielle Schnittstelle senden) sagen, die Benutzer dieser Bestandteil nicht existiert und abbrechen, so entfällt c nichts) leicht die Fähigkeit haben, neue Zutaten zu ändern oder zu ergänzen, wenn sie verändert sind.
  2. Machen Sie das Rezept aussehen weniger Code wie, was der Hauptzweck eines DSL ist, vielleicht ein Rezept Builder bauen? Mit den verfügbaren Zutaten den Benutzer für einen Drink Namen aufzufordern, Zutaten beteiligt und wie viel?

Das Github-Projekt ist hier , fühlen Sie sich frei gabeln und Pull machen Anfragen, oder posten Sie Ihre Code Anregungen und hier Beispiele für andere Benutzer zu sehen. Und wenn man sich alle neugierig sind, wird der Code Arduino, die Ruby-Arduino-Entwicklungs Framework ist hier .

Aktualisieren

I modifiziert und gereinigt Dinge ein wenig bis zum Orion Edwards Vorschlag für ein Rezept zu reflektieren. Es sieht nun wie folgt aus.

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

Ich habe auch einen Hash (Key der Inhaltsstoff und der Wert der Pumpenzahl wobei verhakt ist bis zu). Ich denke, der großen Fortschritt zur Verfügung gestellt. Ich werde die Frage offen für weitere Vorschläge für die jetzt verlassen, aber letztlich Orion Antwort auswählen. Der aktualisierte DSL-Code ist hier .

War es hilfreich?

Lösung

Ohne einen Blick in die Details der Implementierung (oder Ihre Github Links), würde ich versuchen, einen DSL wie folgt schreiben:

(Stehlen von hier: http://supercocktails.com/1310/Long -Insel-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

Ich hoffe, das hilft!

Andere Tipps

Wenn Sie das Rezept wollen natürlicher aussehen soll, warum nicht (aus dem gleichen Rezept Orion Ewards verwendet, danke!):

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)

Dann fügen Sie Treetop in den Mix. Sie könnten Regeln haben, wie:

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

Welche die Baumwipfel-Compiler in einen schönen rubin Modul verwandeln. Dann gilt:

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

Orion DSL sieht sehr schön aus. Die einzige Änderung, die ich möglicherweise von Ihnen „aktualisiert“ Code würde vorschlagen, ist

  1. Ersetzen description mit recipe. Es ist ein beschreibender Begriff
  2. Da die Menge der Zutaten und Aktionen festgelegt ist, binden die Zutaten Variablen anstatt Symbole d.h Sie haben festgelegt, irgendwo vodka = :vodka. Sein ist leichter zu sagen,

    Mix Wodka, Gin und triple_sec # anstelle von: Wodka,: Gin. Triple_sec

sowieso, das ist eine kleine nit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top