Запись Предметно-ориентированного языка для выбора строк от таблицы

Это поведение является ошибкой, попавшей в выпуск hakyll-images 0.3.1. Это было впоследствии исправлено в hakyll-изображениях 0.4 и выше. Просто обновитесь до последней версии, чтобы избавиться от этой проблемы.

Это был грубый недосмотр, и были добавлены тесты, чтобы это больше не повторилось.

Если вы хотите реализовать экземпляры самостоятельно, вы можете взглянуть на то, как это делается здесь .

5
задан Nick Johnson 26 September 2008 в 15:56
поделиться

8 ответов

Создание DSL, который будет интерпретироваться Python.

Шаг 1. Создайте классы среды выполнения и объекты. Эти классы будут иметь все циклы курсора и SQL-операторы и все из которых алгоритмическая обработка убрала в их методах. Вы сделаете интенсивное использование шаблонов разработки Команды и Стратегии для создания этих классов. Большинством вещей является команда, опции и выбор являются сменными стратегиями. Посмотрите на дизайн для Задачи Муравья Apache API - это - хороший пример.

Шаг 2. Проверьте ту эту систему объектов, на самом деле работает. Убедитесь, что дизайн прост и завершен. Вы - тесты, создаст объекты Команды и Стратегии и затем выполнит Объект команды верхнего уровня. Объекты команды сделают работу.

В этой точке Вы в основном сделаны. Ваше время выполнения является просто конфигурацией объектов, созданных из вышеупомянутого домена. [Это не столь легко, как это звучит. Это требует, чтобы некоторый уход определил ряд классов, которые можно инстанцировать и затем "разговор между собой", чтобы сделать работу Вашего приложения.]

Обратите внимание, что то, что Вы будете иметь, потребует не чего иного как объявлений. Что случилось с процедурным? Один Вы начинаете писать DSL с процедурными элементами, Вы находите необходимость во все большем количестве функций, пока Вы не записали Python с другим синтаксисом.Не очень.

Далее, интерпретаторы процедурного языка просто трудно записать. Состоянием выполнения и объемом ссылок просто трудно управлять.

Можно использовать собственный Python - и прекратить волноваться о "выходе из песочницы". Действительно, это - то, как Вы будете единица протестировать все, с помощью короткого сценария Python для создания объектов. Python будет DSL.

["Но ожидайте", Вы говорите, "Если я просто использую Python, поскольку люди DSL могут выполнить произвольные вещи". Зависит от того, что находится на PYTHONPATH и sys.path. Посмотрите на модуль сайта для способов управлять тем, что доступно.]

Декларативный DSL является самым простым. Это - полностью упражнение в представлении. Блок Python, который просто устанавливает значения некоторых переменных, хорош. Это - то, что использует Django.

Можно использовать ConfigParser в качестве языка для представления конфигурации во время выполнения объектов.

Можно использовать JSON или YAML как язык для представления конфигурации во время выполнения объектов. Готовые синтаксические анализаторы полностью доступны.

Можно использовать XML, также. Более трудно разработать и проанализировать, но это хорошо работает. Люди любят его. Это - то, как Муравей и Знаток (и много других инструментов) используют декларативный синтаксис для описания процедур. Я не рекомендую это, потому что это невыносимо. Я рекомендую просто использовать Python.

Или, можно действовать сгоряча и изобрести собственный синтаксис и записать собственный синтаксический анализатор.

4
ответ дан 14 December 2019 в 13:51
поделиться

"реализуйте предметно-ориентированный язык"

"никто не собирается хотеть установить сервер, который загружает и выполняет произвольный код Python во времени выполнения"

Я хочу DSL, но я не хочу, чтобы Python был этим DSL. Хорошо. Как Вы выполните этот DSL? Какое время выполнения приемлемо если не Python?

Что, если у меня есть программа C, которая, оказывается, встраивает интерпретатор Python? Это приемлемо?

И - если Python не является приемлемым временем выполнения - почему это имеет тег Python?

1
ответ дан 14 December 2019 в 13:51
поделиться

Я думаю, что мы испытываем необходимость в немного большей информации здесь. Сообщите мне, основано ли какое-либо следующее на неправильных предположениях.

В первую очередь, как Вы указали на себя, там уже существует DSL для выбора строк от произвольных таблиц - это называют "SQL". Так как Вы не хотите переосмысливать SQL, я предполагаю, что только необходимо запросить от единственной таблицы с фиксированным форматом.

Если это верно, Вы, вероятно, не должны реализовывать DSL (хотя это - конечно, один способ пойти); может быть легче, если Вы используетесь, чтобы Возразить Ориентации, создать Объект фильтра.

Строго говоря, набор "Фильтра", который содержал бы один или несколько объектов SelectionCriterion. Можно реализовать их для наследования одному или нескольким базовым классам, представляющим типы выборов (Диапазон, LessThan, ExactMatch, Как, и т.д.), После того как эти базовые классы существуют, можно создать определенные для столбца наследованные версии, которые соответствуют тому столбцу. Наконец, в зависимости от сложности запросов Вы хотите поддерживать, Вы захотите реализовать некоторое соединительное связующее звено для обработки И и ИЛИ и НЕ связи между различными критериями.

Если Вы чувствуете себя подобно ему, можно создать простой GUI для загрузки набора; я посмотрел бы на просачивающийся Excel как модель, если Вы не имеете ничего больше в виду.

Наконец, это должно быть тривиально для преобразования содержания этого Набора к соответствующему SQL и передачи это к базе данных.

Однако: если то, что Вы после, является простотой, и Ваши пользователи понимают SQL, Вы могли просто попросить, чтобы они ввели в содержании оператора Where и программно создали остальную часть запроса. С точки зрения безопасности, если Ваш код управляет выбранными столбцами и ИЗ пункта и Ваших полномочий базы данных, установлены правильно, и Вы делаете некоторую исправность, проверяющую строку, входящую от пользователей, это было бы относительно безопасной опцией.

1
ответ дан 14 December 2019 в 13:51
поделиться

Почему бы не создать язык, который, когда это "компилирует" его, генерирует SQL или безотносительно языка запросов, которого требует Ваше хранилище данных?

Вы в основном создали бы абстракцию по своему слою персистентности.

0
ответ дан 14 December 2019 в 13:51
поделиться

Вы упомянули Python. Почему бы не использовать Python? Если кто-то может "ввести в" выражении в Вашем DSL, они могут ввести в Python.

Вам будут нужны некоторые правила о структуре выражения, но это намного легче, чем реализация чего-то нового.

0
ответ дан 14 December 2019 в 13:51
поделиться

Это кажется, что Вы хотите создать грамматику не DSL. Я изучил бы ANTLR, который позволит Вам создавать определенный синтаксический анализатор, который интерпретирует текст и переведет в определенные команды. ANTLR обеспечивает библиотеки для Python, SQL, Java, C++, C, C# и т.д.

Кроме того, вот прекрасный пример механизма вычисления ANTLR, созданного в C#

0
ответ дан 14 December 2019 в 13:51
поделиться

Это действительно походит на SQL, но возможно стоит попытаться использовать SQLite, если Вы хотите сохранить это простым?

0
ответ дан 14 December 2019 в 13:51
поделиться

Вы сказали, что никто не собирается хотеть установить сервер, который загружает и выполняет произвольный код во времени выполнения. Однако это точно, что Ваш DSL сделает (в конечном счете), таким образом, вероятно, не будет так большой части различия. Если Вы не делаете что-то очень определенное с данными затем, я не думаю, что DSL купит Вас так очень, и это расстроит пользователей, которые являются уже сведущими в SQL. Не недооценивайте размер задачи, которую Вы будете брать.

Для ответа на вопрос однако необходимо будет придумать грамматику для языка, что-то, чтобы проанализировать текст и обойти дерево, испуская код или называя API, который Вы записали (который является, почему мой комментарий, что Вы все еще оказываетесь перед необходимостью поставлять некоторый код).

Существует много образовательных текстов на грамматиках для математических выражений, к которым можно обратиться в сети, это является довольно прямым. У Вас может быть инструмент парсера-генератора как ANTLR или Yacc, который можно использовать, чтобы помочь Вам генерировать синтаксический анализатор (или используйте язык как Lisp/схема и соедините с двумя). Придумывание разумной грамматики SQL не будет легко. Но Google 'BNF, SQL' и видит то, что Вы придумываете.

Всего наилучшего.

0
ответ дан 14 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: