这是一个权衡。让我举个例子。我在1985年左右偶然发现了
差分执行技术,我认为它是编写用户界面的一种很好的工具。基本上,它采用简单的结构化程序,例如:
void Foo(..args..){
x = y;
if (..some test..){
Bar(arg1, ...)
}
while(..another test..){
...
}
...
}
“mucks” 是一个口语化的词汇,意思是“弄乱、捣乱”。因此,句子的大致意思是:“并且像这样搞乱控制结构:”。
void deFoo(..args..){
if (mode & 1){x = y;}
{int svmode = mode; if (deIf(..some test..)){
deBar(((mode & 1) arg1 : 0), ...)
} mode = svmode;}
{int svmode = mode; while(deIf(..another test..)){
...
} mode = svmode;}
...
}
现在,一个真正好的方法是编写 C 或任何基础语言的解析器,然后遍历解析树,生成我想要的代码。(当我用 Lisp 做时,这部分很容易。)
但是谁想写 C、C++ 或其他语言的解析器呢?
因此,我只需编写宏,以便可以像这样编写代码:
void deFoo(..args..){
PROTECT(x = y);
IF(..some test..)
deBar(PROTECT(arg1), ...)
END
WHILE(..another test..)
...
END
...
}
然而,在C#中这样做时,某些人认为宏是不好的,因此我不想编写C#解析器,所以我必须手动生成代码。这很麻烦,但与通常编写这些东西的方式相比仍然值得。