E 'un compromesso. Lasciatemi fare un esempio. Ho inciampato sulla tecnica di differential execution intorno al 1985 e penso che sia uno strumento davvero valido per la programmazione delle interfacce utente. In sostanza, ci vuole semplici programmi strutturati come questo:
void Foo(..args..){
x = y;
if (..some test..){
Bar(arg1, ...)
}
while(..another test..){
...
}
...
}
e mucks con la struttura di controllo in questo modo:
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;}
...
}
Ora, davvero un buon modo per farlo sarebbe stato quello di scrivere un parser per C o qualsiasi sia la lingua di base, quindi cammina l'albero di analisi, generando il codice che desidero. (Quando l'ho fatto in Lisp, quella parte era facile.)
Ma chi vuole scrivere un parser per C, C++ o altro?
Così, invece, ho solo scrivere delle macro in modo che io possa scrivere il codice in questo modo:
void deFoo(..args..){
PROTECT(x = y);
IF(..some test..)
deBar(PROTECT(arg1), ...)
END
WHILE(..another test..)
...
END
...
}
Tuttavia, quando faccio questo in C#, qualcuno nella loro saggezza ha deciso macro erano male, e io don Non voglio scrivere un parser C#, quindi devo fare la generazione del codice a mano. Questo è un dolore reale, ma vale comunque la pena rispetto al solito modo di codificare queste cose.
fonte
2009-11-30 16:11:17
+1 grazie Mike. Questa è la migliore risposta :) – Viet