Dr Mark H Phillips wrote:
Thanks for the explanation!
On Tue, 2002-09-17 at 19:07, Brian Boutel wrote:
You can't do this because where clauses are not part of the expression syntax. If they were, expressions like
let a=b in c where d=e or if a then b else c where d=e
whould be ambiguous, unless you adopt arbitrary rules about the prededences, and such arbitrary rules are considered a bad thing.
I'm trying to see how ambiguity might arise. Do you mean something like:
let a=1 in a+a where a=3
Yes.
or have you something different in mind?
And I can't yet think of a situation where
if a then b else c where d=e
would cause problems.
The question is whether the local definition of d scopes over the whole conditional expression, or just over the else part. As in if a then d else 2*d where d==e Is the first d the one defined in the where, or one from an enclosing declaration? It's instructive to write a grammar quite abstractly, with rules like exp <- if exp then exp else exp | let decls in exp | exp where decls | ... decls <- decl | decl decls decl <- var = exp and then feed this into a parser generator like yacc, and look at the conflicts it generates. Each one has to be resolved by a shift or reduce decision, or possibly a choice between two reduces, but whichever is chosen, code written on a mistaken assumption will still compile but produce a semantically incorrect program. --brian -- Brian Boutel Wellington New Zealand