Ограничения создания "мини-языка" стали очевидными.
Надлежащие языки имеют древовидную структуру и более сложный синтаксис, чем 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
с лучшим синтаксисом.