Benötigen Sie Hilfe bei einem Arduino gesteuert Getränkespender (bar Affe) ein Ruby-DSL Verbesserung für die Steuerung
-
03-07-2019 - |
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:
- 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.
- 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 .
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
- Ersetzen
description
mitrecipe
. Es ist ein beschreibender Begriff -
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.