Benodig hulp met die verbetering van 'n Ruby DSL vir die beheer van 'n Arduino-beheerde drankdispenser (kroegaap)

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

Vra

Ek skryf 'n DSL in Ruby om 'n Arduino-projek waaraan ek werk te beheer;Bardino.Dit is 'n kroegaap wat sagteware beheer sal word om drankies te bedien.Die Arduino neem opdragte via die seriële poort om die Arduino te vertel watter pompe om aan te skakel en vir hoe lank.

Dit lees tans 'n resep (sien hieronder) en druk dit weer uit.Die kode vir seriële kommunikasie moet nog ingewerk word, asook 'n paar ander idees wat ek hieronder genoem het.

Dit is my eerste DSL en ek werk af van 'n vorige voorbeeld so dit is baie rof om die kante.Enige kritiek, kodeverbeterings (is daar enige goeie verwysings vir Ruby DSL se beste praktyke of idiome?) of enige algemene opmerkings.

Ek het tans 'n rowwe konsep van die DSL so 'n drankie resep lyk soos die volgende (Github skakel):

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

Dit word op sy beurt geïnterpreteer en lei tans tot die volgende (Github skakel):

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

Ingredients:
 Water: 2 ounces

Dit is 'n goeie begin vir die DSL, maar ek dink dit kan 'n bietjie beter geïmplementeer word.Enkele idees wat ek hieronder gehad het:

  1. Definieer watter "bestanddele" beskikbaar is deur die naam van die bestanddeel en die nommerpomp waarmee dit gekoppel is, te gebruik.Gebruik dalk 'n hash?bestanddele = {"water" => 1, "vodka" => 2}.Op hierdie manier, wanneer 'n bestanddeel geïnterpreteer word, kan dit óf a) die pompnommer oor die reekspoort stuur, gevolg deur die aantal onse vir die Arduino om uit te gee b) vir die gebruiker sê dat bestanddeel nie bestaan ​​nie en aborteer sodat niks uitgegee word nie c) maklik die vermoë hê om nuwe bestanddele te verander of by te voeg as hulle verander word.
  2. Om die resep minder kode te laat lyk, wat die hoofdoel van 'n DSL is, miskien 'n resepbouer te bou?Gebruik die beskikbare bestanddele om die gebruiker te vra vir 'n drankie naam, bestanddele betrokke en hoeveel?

Die Github-projek is hier, voel vry om te vurk en trekversoeke te maak, of plaas jou kodevoorstelle en voorbeelde hier vir ander gebruikers om te sien.En as jy enigsins nuuskierig is, is die Arduino-kode wat die Ruby Arduino-ontwikkelingsraamwerk gebruik hier.

Opdateer

Ek het dinge bietjie verander en skoongemaak om Orion Edwards se voorstel vir 'n resep te weerspieël.Dit lyk nou soos volg.

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

Ek het ook 'n hash bygevoeg (sleutel is die bestanddeel en die waarde van die pompnommer waaraan dit gekoppel is).Ek dink dit het baie vordering gemaak.Ek sal die vraag vir eers oop laat vir enige verdere voorstelle, maar sal uiteindelik Orion se antwoord kies.Die opgedateerde DSL-kode is hier.

Was dit nuttig?

Oplossing

Sonder om na die implementeringsbesonderhede (of jou github-skakels) te kyk, sal ek probeer om 'n DSL soos hierdie te skryf:

(steel van hier af: 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

Hoop dit help!

Ander wenke

As jy wil hê die resep moet natuurliker lyk, hoekom nie (van dieselfde resep wat Orion Ewards gebruik het, dankie!):

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)

Voeg dan by Boomtop aan die mengsel.Jy kan reëls hê soos:

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

Wat die boomtopsamesteller in 'n lekker robynmodule sal omskep.Toe:

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

Orion se DSL lyk baie mooi.Die enigste verandering wat ek moontlik van jou "bygewerkte" kode sou voorstel, is

  1. Vervang description met recipe.Dit is 'n meer beskrywende term
  2. Aangesien die stel bestanddele en aksies vas is, bind die bestanddele aan veranderlikes eerder as simbole, dit wil sê jy het vodka = :vodka iewers gedefinieer.Dit is makliker om te sê

    meng vodka, gin en triple_sec # in plaas daarvan om :vodka, :gin en :triple_sec te gebruik.

dit is in elk geval 'n geringe nit.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top