Когда DSL становится «шустрым» - PullRequest
0 голосов
/ 24 февраля 2012

В недавний вопрос о DSL Я попытался смешать выражения DSL с выражениями языка встраивания, который оказывается процедурным (в данном случае Python). После некоторых экспериментов я собираюсь отказаться от продолжения строгого процедурного синтаксиса в пользу стиля lispy, то есть вместо моей первоначальной идеи

 @MY_DSL_FOO_FUNCTION(params,@ANOTHER_DSL_FUNCTION(...),expression_in_python,more_expressions_in_python)

Я сейчас склоняюсь к

  {MY_DSL_FOO_FUNCTION params,{ANOTHER_DSL_FUNCTION ...},expression_in_python,more_expressions_in_python}

Какие-либо мнения (желательно основанные на опыте) по этому синтаксическому решению?

1 Ответ

2 голосов
/ 24 февраля 2012

Если вы измените этот синтаксис чуть больше, чтобы использовать () 'a и' правильно, вам не нужен "DSL".

У тебя обычный старый Python. Жизнь хороша.

from my_standard_package import *

(MY_DSL_FOO_FUNCTION, params, (ANOTHER_DSL_FUNCTION, ), expression_in_python, more_expressions_in_python)

Все, что вам нужно сделать, это добавить, s. Поскольку у вас, кажется, есть две вещи - функции и выражения, возможно, вы имеете в виду это.

( MY_DSL_FOO_FUNCTION(params), ANOTHER_DSL_FUNCTION(), expression_in_python, more_expressions_in_python )

Это было бы, возможно, более Pythonic.

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

from functools import partial
( partial(MY_DSL_FOO_FUNCTION, params), ANOTHER_DSL_FUNCTION, lambda: expression_in_python, lambda: more_expressions_in_python )

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

...