Не уверен, что это подходит в декларативное программирование... Больше нестройных размышлений, чем по сути.
Вот интересно, есть ли шанс у DSL использоваться для задач конечных пользователей? Есть ли какие-то успешные примеры такого рода? Мне известно несколько таких DSL, но насколько я могу судить, они не очень-то выживают.
Примеры из жизни:
TaskJuggler — планирование проектов.
task test "Software testing" {
task alpha "Alpha Test" {
effort 1w
depends !!software
allocate test, dev2
note "Hopefully most bugs will be found and fixed here."
}
task beta "Beta Test" {
effort 4w
depends !alpha
allocate test, dev1
}
}
Лично я использую, но неудержимо тянет написать свое, с блекджеком и прочим. Раздражает слишком развесистый синтаксиси отсутствие некоторых функций.
Вот еще пример — Faces, тоже, для того же, но базе питона — чем-то даже лучше TJ, но прибит гвозями к GUI, а GUI стремный и глючный.
def PlanAndControl():
title = "Planing and Controlling"
#for meeting etc
resource = dev1 & dev2 & dev3 & tester & doc
start = up.Deliveries.Begin.start
end = up.Deliveries.Done.end
load = WeeklyMax("4H")
def Deliveries():
title = "Milestones"
account = "rev"
def Begin():
title = "Projectstart"
start = Multi("2002-01-16", delayed="2002-01-24")
credit = 33000.0
def Prev():
title = "Technology Preview"
milestone = True
start = up.up.Software.Backend.end
credit = 13000.0
gantt_same_row = up.Begin
Вот еще пример — уже собственный DSL — планирование рейсов:
РЕЙС "ТРИЛАЙН - ТРИЛАЙН"
НАЧАЛО "2008-03-01 06:10:00"
ПРОДОЛЖИТЕЛЬНОСТЬ 4 ЧАСА
ПУНКТ 1 "ТРИЛАЙН"
ПРИБЫТИЕ 10 МИНУТ ОТ РЕЙС/НАЧАЛО
УБЫТИЕ 5 МИНУТ ОТ ПРИБЫТИЕ
ПУНКТ 2 "ТАГАНСКАЯ ПЛОЩАДЬ"
ПРИБЫТИЕ 5 ЧАСОВ ОТ РЕЙС/НАЧАЛО
УБЫТИЕ 5 МИНУТ ОТ ПРИБЫТИЕ
ПУНКТ 3 "ДИНАМО"
ПРИБЫТИЕ 3 ЧАСА 20 МИНУТ ОТ ПУНКТ#2/УБЫТИЕ
УБЫТИЕ 5 МИНУТ ОТ ПРИБЫТИЕ
ПУНКТ 66 "ЧИСТЫЕ ПРУДЫ"
ПРИБЫТИЕ 3 ЧАСА 20 МИНУТ ОТ РЕЙС/НАЧАЛО
УБЫТИЕ 5 МИНУТ ОТ ПРИБЫТИЕ
По результатам обсуждения с людьми, близкими по менталитету к заказчикам продукта, пришлось отказаться от предоставления пользователю возможности редактировать DSL напрямую, так что DSL сериализуется в XML/DOM, из него на клиенте генерируется динамическая форма, которая при самбите обходится и по которой генерируется все тот же DSL, но уже измененный. Но сам DSL фактически пропал раз пользователю недоступен — можно было и тупо XML туда-сюда гонять. Лично я по поводу этого решения испытываю сожаление — по моему, довольно стройная получалась в начале концепция.
Это я к чему. Есть ли у вас живые успешные примеры DSL, который рассчитан на редактирование конечными пользователями систем (не разработчиками) ?
Просто хочется иметь какое-то количество решений для домашнего и не очень применения — планирование проектов, построение roadmap-ов, управление сметами/бюджетами и т.п. Без GUI — задачи редуцируются до достаточно примитивных утилит — которые на входе получают текст на DSL с описанием, на выходе — отчет в каком-то виде. Интересно, может ли у таких продуктов быть вообще В ПРИНЦИПЕ немаргинальная аудитория? Видите ли вы перспективы в использовании подобного подхода? Ну и вообще...