DSL в основном создает свой собственный маленький подъязык для решения конкретной проблемы домена. Это решается с помощью метода цепочки. Языки, где точки и круглые скобки являются необязательными, помогают сделать это выражение более естественным. Это также может быть похоже на шаблон строителя.
DSL сами по себе не языки, а скорее шаблон, который вы применяете к своему API, чтобы сделать вызовы более понятными.
Одним из примеров является Guice, Руководство пользователя Guice http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 содержит дальнейшее описание того, как интерфейсы связаны с реализациями и в каких контекстах.
Другой распространенный пример - языки запросов. Например:
NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")
В реализации представьте, что каждый метод возвращает либо новый объект Query, либо только само его обновление. В любой момент вы можете завершить цепочку, используя, например, row (), чтобы получить все строки, или updateSomeField, как я делал выше. Оба вернут объект результата.
Я бы порекомендовал также взглянуть на приведенный выше пример Guice, поскольку каждый вызов там возвращает новый тип с новыми опциями. Хорошая IDE позволит вам завершить работу, давая понять, какие варианты у вас есть в каждой точке.
Редактировать: кажется, многие считают DSL новыми, простыми, специализированными языками со своими собственными анализаторами. Я всегда ассоциирую DSL как использование цепочки методов в качестве соглашения для выражения операций.