Это компромисс. Позвольте мне привести пример. Я наткнулся на технику дифференциального исполнения примерно в 1985 году и считаю, что это действительно хороший инструмент для программирования пользовательских интерфейсов. По сути, это простые структурированные программы, такие как:
void Foo(..args..){
x = y;
if (..some test..){
Bar(arg1, ...)
}
while(..another test..){
...
}
...
}
и гадости с такой структурой управления:
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 или любого другого базового языка, а затем пройтись по дереву синтаксического анализа, генерируя нужный мне код. (Когда я делал это в Лиспе, эта часть была легкой.)
Но кто хочет написать парсер для C, C ++ или чего-то еще?
Вместо этого я просто пишу макросы, чтобы можно было написать код следующим образом:
void deFoo(..args..){
PROTECT(x = y);
IF(..some test..)
deBar(PROTECT(arg1), ...)
END
WHILE(..another test..)
...
END
...
}
Однако, когда я делаю это в C #, кто-то в своей мудрости решил, что макросы плохие, и я не хочу писать синтаксический анализатор C #, поэтому я должен выполнить генерацию кода вручную. Это королевская боль, но она все же стоит того, чтобы кодировать эти вещи.