6

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

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

アップデート

Orion Edwards のレシピに対する提案を反映するために、少し変更してクリーンアップしました。現在は次のようになっています。

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

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

4

3 に答える 3

5

実装の詳細 (または 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

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

于 2008-10-02T20:16:28.553 に答える
3

レシピをより自然に見せたい場合は、(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)

次に、 Treetopをミックスに追加します。次のようなルールがあります。

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

どのツリートップコンパイラが素晴らしいrubyモジュールに変換されるか。それで:

parser = CocktailParser.new
r = parser.parse(recipe)
于 2008-12-13T21:16:24.823 に答える
1

Orion の DSL はとても良さそうです。「更新された」コードから私がおそらく提案する唯一の変更は

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

    # :vodka、:gin、:triple_sec を使用する代わりに、vodka、gin、triple_sec を混ぜてください。

とにかくそれはマイナーなニットです。

于 2008-10-03T05:50:06.507 に答える