Original:

[combine {wrap comb} ops env] ~ [combine comb [eval-list ops env] env] 

We introduce code. What is the affect on combine? Is there an affect on operatives? No, because operatives do not evaluate their operands. When combining applicatives we may need to do things. Because we are evaluating arguments. When the operator evaluates to a code value we cannot do anything with the operands, because we do not know if the operator will be an operative or applicative, so we just preserve the operands in the returned code value. When the operator evaluates to an combiner we can proceed with further work. If it is an operative we can perform the combination as in Kernel. If it is an applicative we will proceed with evaluating the operand expressions to argument values. If the argument values are code values we shall once again emit a code value. If we wish to preserve evaluation ordering whe have to do let insertion here (by placing them in the returned code, as a separate part from the expression). If we do not care, we do not have to?


[combine \* ops env] ~ standard
[combine {wrap _} ops env] ~ evaluate ops
[combine {code _} ops env] ~ return code, preserve ops and env.