私が取り組んでいる 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, "ウォッカ" => 2}. このようにして、成分が解釈されると、a)シリアルポートを介してポンプ番号を送信し、続いてArduinoが分配するオンス数を送信しますb)成分が存在しないことをユーザーに伝え、中止するため、何も分配されませんc)変更された場合、新しい成分を簡単に変更または追加できます。
- 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 コードはこちらです。