
On 12/28/11 10:23 AM, Jon Fairbairn wrote:
Thiago Negri
writes: Lazy evaluation is one implementation of non-strict semantics, where the arguments are evaluated only when they are needed.
I would say this:
* non-strict semantics require that no argument is evaluated unless needed.
I'm not sure that's quite right. As mentioned upthread, you can have eager non-strict languages. I think the more correct way to view it is that strict semantics require that non-termination of evaluating arguments entails non-termination of evaluating the application ---i.e., if [[ x ]] == _|_ then [[ f x ]] == _|_---, whereas non-strict semantics do not have this requirement. Thus, we're allowed to evaluate unused arguments, provided that doing so does not inhibit us from giving the proper result for evaluating the application. Some possibilities would be: to fork off a thread for evaluation of each subterm, or to eagerly evaluate arguments optimistically but then fall back to a non-strict evaluation model if the argument takes too long to finish, or to restrict ourselves to a total language and then use any strict semantics we like (since strict and non-strict coincide if there is no bottom),... -- Live well, ~wren