Réponse:   Pour n'évaluer les arguments qu'une seule fois, on place leur valeur dans des variables auxillaires. Pour pouvoir emboîter les appels imbriqués de façon systématique, on place également le résultat de chaque appel dans des variables auxillaires.

Pour cela, on introduit pour chaque fonction expansée en ligne autant de variables nouvelles que d'arguments, plus une variable nouvelle pour le résultat. On prend soin de renommer les variables du corps de la fonction expansée en ligne de façon cohérente.

function quatre (n : integer) : integer;
var n1 : integer; var carré1 : integer;
var n2 : integer; var carré2 : integer;
begin    
   n1 := n;                 (* argument de l'appel le plus interne *)
   carré1 := n1 * n1;       (* résultat du premier appel *)
   n2 := carré1;            (* argument du deuxième appel *)
   carré2 := n2 * n2;       (* argument de l'appel externe *)
   quatre := carré2 
end;
Précisons que les variables auxilliaires ne pénalisent pas (en général) le programme, car elles seront associées à des temporaires qui pourront si besoin partager le même registre. Au pire, dans des cas pathologiques, la séquentialisation pourrait éliminer quelques opportunités de simplification.