A definição inicial de SPM_quot
REPLACE_BODY", que corresponde ao corpo
inicial de cada método do envelope, contém apenas uma invocação à
carta. Na realidade, e porque os dois casos são distintos, existem duas
versões desta macro. Uma que é utilizada em métodos com retorno e
outra em métodos que não retornam valores. O código de retorno do
valor é exterior à macro (ver definição de SPM_quot
R_LETENV_METHOD", na
página ).
#define REPLACE_BODY(type,method,args...) \ SPELLCAST(type##Letter,letter)::method(args); #define R_REPLACE_BODY(type,method,args...) \ ___method_result___ = SPELLCAST(type##Letter,letter)::method(args);
Ambas as macros podem ser modificadas pela intervenção do programador, sendo este responsável pela coerência dos tipos e valores de retorno que introduza no código dos envelopes.
A redefinição das macros implica a perda dos corpos iniciais, ficando
indeterminado o comportamento do envelope, i.e., fica, por completo,
sob o controlo do código do programador que fez a alteração. A
alteração de SPM_quot
R_REPLACE_BODY" assume implicitamente uma
atribuição a SPM_quot
___method_result___" (a variável retorna no fim da
execução do método). Se a atribuição não for feita o código que
invocou o método pode comportar-se erroneamente.
Note-se que a indeterminação do comportamento do código do envelope pode conduzir a um comportamento imprevisível para o programa como um todo, pois é o envelope o encarregado de invocar o código do nível de programa.