Мне нужно создать DSL для непрограммистов (клиентов нашей компании), которым необходимо предоставить некоторые языковые функции более высокого уровня (циклы, условные выражения, переменные ... - так что это не просто "простой" DSL).
Работать с DSL должно быть легко;люди должны быть в состоянии экспериментировать с этим и учиться этому, играя вокруг.Мы хотим добиться чего-то похожего на макросы в Microsoft Excel - многие пользователи Excel могут создавать простые формулы, суммы или вычисления и никогда не работали с «настоящим» (универсальным) языком программирования.
Очевидно, что не каждый Excel-Пользователь понимает более сложные встроенные методы (например, When ()), но они могут использовать простые методы, такие как SUM () или AVG ().Я хочу добиться аналогичного эффекта с DSL - пользователи должны иметь возможность интуитивно работать с ним и определять простые правила или выполнять простые вычисления.В то же время DSL должен предлагать высокоуровневые функции для более технически склонных - таких как циклы, операторы if, возможно методы или лямбда-выражения.
И это подводит меня к моему вопросу (ам): Какие языковые конструкции интуитивно понятны, их легко выучить и понять?
В текущей экспериментальной версии DSLмы попробовали метод цепочки методов, пример: list.where(item -> item.value > 5).select(item -> item.name + " " + item.value)
).Думайте о where
и select
как о конструкциях foreach
, где item
- это переменная, представляющая текущий элемент в цикле.
Причина, по которой мы сначала попробовали этот подход, состоит в том, что было бы легкоподдержка завершения кода - всякий раз, когда пользователь вводит точку (.
), показывается список возможных методов.Однако я не уверен, что эта концепция соответствует моим критериям интуитивности, простоты понимания и чтения.
Легче / удобочитаемее для пользователей, если нет фигурных скобок?(как в LINQ: from item in list where item.value > 5 select item.name + " " + item.value
).Однако в этом случае нет никаких «границ» - в предыдущем примере пользователь знает, что оператор заканчивается последней закрывающей скобкой - в этом случае, если он набирает больше кода после части select
оператора, он не'- знать, относится ли оно к утверждению или нет (кроме того факта, что синтаксический анализатор не будет знать об этом и должно быть какое-то закрытие).
Надеюсь, мой вопрос немного яснее сэти 2 примера - я ищу рекомендации по проектированию, лучшие практики, реальный опыт , вероятно исследовательский материал из которых языковые конструкции благоприятны для других - или некоторую оценку плюсов иминусы некоторых языковых конструкций.
Я не ищу информации о том, как создать DSL, какие генераторы синтаксического анализатора я мог бы использовать и т. д., а также я не могу использовать существующий общий-целевой язык (Ruby, Python, ...) вместо того, чтобы использовать DSL.(DSL, когда разбирается, работает напрямую с нашей объектной моделью - я не буду вдаваться в детали, поскольку этот вопрос уже достаточно длинный).
Редактировать: Возможно, я должен отметить, что под "языковыми конструкциями" я подразумеваю синтаксис, способ написания чего-либо, а не то, какую функциональность должен предлагать язык - у нас уже естьсписок талантов, которые DSL должен предоставить.Вопрос в том, как лучше всего выразить эти особенности, чтобы можно было создавать (и поддерживать) простые и сложные формулы.