Arduinoが制御するドリンクディスペンサー(バーモンキー)を制御するためのRuby DSLの改善に支援が必要
-
03-07-2019 - |
質問
現在取り組んでいる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の良い出発点ですが、少し良く実装できると思います。以下にいくつかのアイデアがありました:
- 「成分」の定義材料の名前と、それが接続されているポンプ番号を使用して利用できます。たぶんハッシュを使用していますか?成分= {"水&quot ;; => 1、「ウォッカ」 => 2}。このように、成分が解釈されると、a)シリアルポートを介してポンプ番号を送信し、続いてArduinoが分配するオンスの数を送信しますb)成分が存在しないことをユーザーに伝えて、何も分配されないc)変更された場合、新しい成分を簡単に変更または追加できます。
- レシピのコードを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は非常に優れています。 「更新済み」と思われる唯一の変更点コードは
-
description
をrecipe
に置き換えます。より説明的な用語です -
成分とアクションのセットが固定されているため、成分をシンボルではなく変数にバインドします。つまり、
vodka =:vodka
をどこかで定義しています。言いやすいです:vodka、:gin、および:triple_secを使用する代わりに、vodka、gin、およびtriple_secを混合します。
とにかくそれは些細なことです。