Arduinoが制御するドリンクディスペンサー(バーモンキー)を制御するためのRuby DSLの改善に支援が必要

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

質問

現在取り組んでいるArduinoプロジェクトを制御するために、RubyでDSLを書いています。バルディーノ。それは飲み物を提供するためにソフトウェア制御されるバーモンキーです。 Arduinoは、シリアルポートを介してコマンドを受け取り、Arduinoにどのポンプをオンにするか、およびどのくらいの時間を指示します。

現在、レシピ(下記を参照)を読み取り、それを出力します。シリアル通信用のコードは、私が以下で言及した他のいくつかのアイデアと同様にまだ作業する必要があります。

これは私の最初のDSLであり、前の例に取り組んでいるので、端が非常に荒いです。批評、コードの改善(Ruby DSLのベストプラクティスやイディオムの参考資料はありますか?)、または一般的なコメント。

現在DSLの大まかなドラフトがありますので、飲み物のレシピは次のようになります( Githubリンク):

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

これは順番に解釈され、現在次のようになります( Githubリンク):

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

Ingredients:
 Water: 2 ounces

これはDSLの良い出発点ですが、少し良く実装できると思います。以下にいくつかのアイデアがありました:

  1. 「成分」の定義材料の名前と、それが接続されているポンプ番号を使用して利用できます。たぶんハッシュを使用していますか?成分= {"水&quot ;; => 1、「ウォッカ」 => 2}。このように、成分が解釈されると、a)シリアルポートを介してポンプ番号を送信し、続いてArduinoが分配するオンスの数を送信しますb)成分が存在しないことをユーザーに伝えて、何も分配されないc)変更された場合、新しい成分を簡単に変更または追加できます。
  2. レシピのコードをDSLの主な目的のように見せるコードを少なくすることで、レシピビルダーを構築できますか?使用可能な材料を使用して、ユーザーに飲み物の名前、関係する材料、およびその量を尋ねますか?

Githubプロジェクトはこちらです。気軽に分岐してプルしてくださいリクエストするか、他のユーザーが見ることができるようにコードの提案と例をここに投稿してください。興味があれば、Ruby Arduino開発フレームワークを使用するArduinoコードはこちら

更新

オリオン・エドワーズのレシピの提案を反映するために、物事を少し修正して整理しました。次のようになりました。

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

ハッシュも追加しました(キーは成分で、値は接続先のポンプ番号です)。これは大きな進歩をもたらしたと思います。今後の提案のために質問を開いたままにしますが、最終的にはOrionの答えを選択します。更新されたDSLコードはこちらです。

>
役に立ちましたか?

解決

実装の詳細(またはgithubリンク)を調べることなく、次のようなDSLを作成してみます。

(ここから盗みます: 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

役立つことを願っています!

他のヒント

レシピをより自然に見せたい場合は、そうではありません(Orion 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)

次に、ツリートップをミックスに追加します。次のようなルールを設定できます。

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

treetopコンパイラは、素敵なrubyモジュールに変換されます。次に:

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

OrionのDSLは非常に優れています。 「更新済み」と思われる唯一の変更点コードは

  1. description recipe に置き換えます。より説明的な用語です
  2. 成分とアクションのセットが固定されているため、成分をシンボルではなく変数にバインドします。つまり、 vodka =:vodka をどこかで定義しています。言いやすいです

    :vodka、:gin、および:triple_secを使用する代わりに、vodka、gin、およびtriple_secを混合します。

とにかくそれは些細なことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top