Технически, ruby - это не DSL, он просто позволяет очень аккуратно писать внутренние DSL. Эта ссылка на вики-блог Мартина Фаулера должна помочь прояснить ситуацию.
Rails был описан как DSL, хотя я думаю об этом более точно как о структуре, которая очень хорошо использует несколько DSL.
Редактировать: Вступление к публичной версии книги DSL Мартина Фаулера содержит мотивирующий пример, хотя оно все еще ориентировано на программистов.
Снова отредактируйте: пример "voodoo" может быть полезен, если вы укажете, что ruby позволяет рубиновому коду выглядеть как
port 2001
respond :resource=>"/hello" do |request, response|
response.body = "<message>hello</message>"
end
, который чище, чем прямой вызов методов. Реализация DSL может потребовать кода типа «вуду» (создание * DSL намного сложнее, чем его использование), и в целом кто-то относительно новичок в кодировании должен в первую очередь беспокоиться о том, что делает DSL, а не так это реализовано.
Что делает ruby хорошим во внутренних DSL, включает в себя (1) использование блоков (у любого языка с чистыми замыканиями есть это преимущество), (2) класс методов, которые не требуют скобок, и (3) возможность изменять классы в летать (что делает validates
). Вероятно, есть еще кое-что, о чем я не думал.