如何在Python中使用m4并处理indendentation和whitespace

时间:2015-03-12 21:42:00

标签: python macros m4

在Python中使用m4是否有一个很好的通用策略?具体来说,Python的空白要求使得使用m4有点尴尬。例如,以下程序:

def foo():
    pushdef(`X',`    $1 = $2')
    include(test01.def)
    popdef(`X')

foo()

test01.def

X(x,1)
X(y,2)
X(z,3)

生成python程序:

def foo():

        x = 1
    y = 2
    z = 3



foo()

因此,缩进是关闭的。当然,我们可以用

解决这个问题
def foo():
pushdef(`X',`    $1 = $2')
include(test01.def)
popdef(`X')

foo()

但是,我觉得我们编辑的文件变得很难看,因为跟踪代码组织中的缩进比较困难。真的,我希望能够做的是使用第一个程序并让m4在包含之前吃掉前导空格。我不确定m4是否有可能吃到领先的空白。

此外,我知道有特定于Python的宏实用程序。但是,我对使用它们感兴趣。我需要在许多不同的语言中使用这些X宏,例如在C和LaTeX中,我打算在每种情况下都使用m4,因为它很容易获得并且语言不可知。因此,如果可能的话,我真的在寻找m4解决方案。

1 个答案:

答案 0 :(得分:1)

是否可以接受以下内容?

define(INCLUDE_ON_NEW_LINE, `
include($1)')

`def foo():'
    pushdef(`X',`    $1 = $2')
    INCLUDE_ON_NEW_LINE(`test01.def')
    popdef(`X')

`foo()'

如果您发现输出更令人满意,可以在前一行添加额外的dnl。并非所有的报价都需要,但我要谨慎。

但老实说,我发现你的“丑陋”解决方案更容易理解。为什么M4代码应该像Python代码一样缩进?