Я пишу DSL на Ruby для управления проектом Arduino, над которым я работаю; Bardino. Это барная обезьяна, которая будет контролироваться программным обеспечением для подачи напитков. Arduino принимает команды через последовательный порт, чтобы сообщить Arduino, какие насосы включить и как долго.
В настоящее время он читает рецепт (см. Ниже) и печатает его обратно. Код для последовательной связи все еще нуждается в разработке, а также некоторые другие идеи, которые я упомянул ниже.
Это мой первый DSL, и я работаю над предыдущим примером, поэтому он очень грубый по краям. Любые критические замечания, улучшения кода (есть ли хорошие ссылки на лучшие практики Rubi DSL или идиомы?) Или какие-либо общие комментарии.
В настоящее время у меня есть черновик DSL, поэтому рецепт напитка выглядит следующим образом ( Github link ):
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, однако, я думаю, что это может быть реализовано немного лучше. Некоторые идеи у меня были ниже:
- Определение того, какие «ингредиенты» доступны, используя название ингредиента и номер насоса, к которому он подключен. Может быть, используя хэш? ингридиенты = {"water" => 1, "vodka" => 2}. Таким образом, когда ингредиент интерпретируется, он может либо: а) послать номер насоса через последовательный порт, а затем указать количество унций, которое Arduino должен выдать; легко иметь возможность менять или добавлять новые ингредиенты, если они изменились.
- Чтобы рецепт выглядел менее похожим на код, что является главной целью DSL, может быть, создать конструктор рецептов? Использование доступных ингредиентов, чтобы подсказать пользователю название напитка, ингредиенты и сколько?
Проект Github здесь , не стесняйтесь разветвляться и делать пулл-запросы, или публиковать здесь свои предложения и примеры кода для просмотра другими пользователями. И если вам интересно, код Arduino с использованием среды разработки Ruby Arduino - это здесь .
Обновление
Я немного изменил и очистил вещи, чтобы отразить предложение Ориона Эдвардса для рецепта. Теперь это выглядит следующим образом.
description 'Screwdriver' do
serve_in 'Highball Glass'
ingredients do
2.ounces :vodka
5.ounces :orange_juice
end
end
Я также добавил хэш (ключом является ингредиент и значение, к которому относится номер насоса). Я думаю, что это обеспечило большой прогресс. Я оставлю вопрос открытым для любых дальнейших предложений, но в конечном итоге выберу ответ Ориона. Обновленный DSL-код здесь .