Интерпретатор Python для добавления операторов if - PullRequest
1 голос
/ 26 мая 2011

Для одного из моих проектов у меня есть программа на python, построенная вокруг класса python cmd . Это позволило мне создать мини-язык вокруг SQL-операторов, которые я отправлял в базу данных. Помимо упрощения соединения с python, я мог делать вещи, которые sql не может делать. Это было очень важно для нескольких проектов. Однако теперь мне нужно добавить блоки if для большего потока управления.

В настоящее время я думаю, что я добавлю две новые команды в язык, IF и END. Они устанавливают переменную, которая определяет, пропустить ли строку. Я хотел бы знать, если кто-то еще сделал это с модулем cmd, и если так, есть ли стандартный метод, который я пропускаю? Google, похоже, ничего не раскрывает, и документы CMD тоже ничего не раскрывают.

Для идеи, которая похожа на то, что я делаю, иди сюда . Вопросы и комментарии приветствуются. :)

Хм, немного сложнее, чем я думал, хотя было бы неплохо иметь синтаксис python. Я долго обсуждал создание мини-языка, прежде чем наконец это сделал. Проблема в первую очередь проистекает из внешних ограничений. У меня есть куча «данных», которые щедро превращаются в sql. Это основано на других «данных», которые не пройдут. Это также уникально для каждой конкретной «версии» проблемы. Делать прямые данные в sql было бы моим первым уклоном, но это было непрактично.

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

Если бы я построил эту штуку на чистом питоне, у меня не было бы той гибкости, которая была мне абсолютно необходима для решения проблемы.

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Ограничения создания "мини-языка" стали очевидными.

Надлежащие языки имеют древовидную структуру и более сложный синтаксис, чем cmd может легко обрабатываться.

Иногда на самом деле проще использовать Python напрямую, чем изобретать свой собственный DSL.

В настоящее время ваш DSL, вероятно, читает подобный сценарию файл команд.

Из-за способа работы cmd ваши маленькие комментарии получают строковый аргумент, который должен быть проанализирован. Затем команда выполняется. И, кроме того, каждая команда является методом подкласса cmd.Cmd.

Вот что вы можете сделать.

Каждый метод do_foo( self, args ) становится отдельным вызываемым объектом. Он будет следовать шаблону Command . Он будет точно делать то, что сейчас делает функция метода. Не меньше. Точно то же самое.

class Foo( object ):
    def __init__( self, global_context ):
        self.context= global_context
    def __call__( self, args ):
        ... The rest of do_foo ... 

Кроме того, существующий подкласс cmd.Cmd, вероятно, поддерживает некоторое внутреннее состояние. Все переменные экземпляра self.this и self.that должны быть изменены на ссылки и явный контекстный объект.

class Context( object ): pass

Измените self.this или self.that на self.context.this или self.context.that

Теперь вы можете создавать свой контекст и различные команды.

ctx = Context()
foo= Foo(ctx)

Ваш скрипт немного меняет синтаксис. От:

foo argstring
bar argstring

до:

from mylanguage import foo, bar
foo( "argstring" )
bar( "argstring" )

Это делает Точно , что сейчас делает CLI. Больше не надо. Не меньше. Точно то же самое. Немного другой синтаксис.

Теперь ваш сценарий больше не находится в DSL, который сложно расширить. Это на Python.

Сделав это, теперь вы можете использовать синтаксис Python if операторов.

У вас есть Точная функциональность, в настоящее время реализованная в cmd с лучшим синтаксисом.

0 голосов
/ 20 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...