在a recent question about a 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}
关于此语法决定的任何意见(最好是基于经验)?
答案 0 :(得分:2)
如果您稍微修改一下这种语法,以便正确地使用()' a和#,那么您就不需要" DSL"。
你有普通的Python。生活很美好。
from my_standard_package import *
(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 )
那可能更像是Pythonic。
但也许你的目标是某种后期绑定,其中元组稍后会在某些其他环境中进行评估。
from functools import partial
( partial(MY_DSL_FOO_FUNCTION, params), ANOTHER_DSL_FUNCTION, lambda: expression_in_python, lambda: more_expressions_in_python )
通过这种方式,带参数的函数用于构建可以在以后评估的其他函数。是。这确实涉及更多语法。然而。它还避免了创建另一种语言。