Es una solución de compromiso. Déjame dar un ejemplo. Me encontré con la técnica de differential execution alrededor de 1985, y creo que es una herramienta realmente buena para programar interfaces de usuario. Básicamente, se necesitan programas sencillos estructurados como este:
void Foo(..args..){
x = y;
if (..some test..){
Bar(arg1, ...)
}
while(..another test..){
...
}
...
}
y mucks con la estructura de control de la siguiente manera:
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;}
...
}
Ahora, una muy buena manera de hacer eso habría sido escribir un analizador de C o cualquiera que sea el idioma base, y luego recorra el árbol de análisis, generando el código que quiero. (Cuando lo hice en Lisp, esa parte fue fácil.)
¿Pero quién quiere escribir un analizador para C, C++ o lo que sea?
Así, en lugar, acabo de escribir macros para que pueda escribir el código como el siguiente:
void deFoo(..args..){
PROTECT(x = y);
IF(..some test..)
deBar(PROTECT(arg1), ...)
END
WHILE(..another test..)
...
END
...
}
Sin embargo, cuando hago esto en C#, alguien en su sabiduría decidió macros eran malos, y Don No quiero escribir un analizador C#, así que tengo que hacer la generación de código a mano. Es un dolor real, pero aún vale la pena en comparación con la forma habitual de codificar estas cosas.
+1 gracias Mike. Esa es la mejor respuesta :) – Viet