Es ist ein Kompromiss ist abgedeckt werden. Lassen Sie mich ein Beispiel geben. Ich bin ungefähr 1985 auf die Technik von differential execution gestoßen, und ich denke, es ist ein wirklich gutes Werkzeug für die Programmierung von Benutzeroberflächen. Grundsätzlich dauert es einfach strukturierte Programme wie folgt aus:
void Foo(..args..){
x = y;
if (..some test..){
Bar(arg1, ...)
}
while(..another test..){
...
}
...
}
und mucks mit der Steuerstruktur wie folgt aus:
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;}
...
}
nun eine wirklich gute Möglichkeit, dies zu tun gewesen wäre, um einen Parser zu schreiben für C oder was auch immer die Basissprache ist, und gehen Sie dann den Syntaxbaum, um den gewünschten Code zu generieren. (Wenn ich es in Lisp gemacht habe, war dieser Teil einfach.)
Aber wer will einen Parser für C, C++ oder was auch immer schreiben?
Anstatt also, ich habe gerade Makros schreiben, so dass ich den Code so schreiben kann:
void deFoo(..args..){
PROTECT(x = y);
IF(..some test..)
deBar(PROTECT(arg1), ...)
END
WHILE(..another test..)
...
END
...
}
Allerdings, wenn ich dies in C# zu tun, jemand in ihrer Weisheit beschlossen Makros war schlecht, und ich don Ich möchte keinen C# Parser schreiben, also muss ich die Code-Generierung von Hand machen. Das ist ein königlicher Schmerz, aber es ist es immer noch wert, verglichen mit der üblichen Art, diese Dinge zu kodieren.
+1 danke Mike. Das ist die beste Antwort :) – Viet