Jules Jacobs wrote:
declare
proc {Test X}
case X of f(a Y c) then {Browse 'case'(1)}
else {Browse 'case'(2)} end
end
declare X Y {Test f(X Y d)} % blocks
declare X Y {Test f(d X Y)} % displays 'case'(2)
Have a look at the corresponding section in the Oz Tutorial:
http://www.mozart-oz.org/documentation/tutorial/node5.html#control.pattern
==============================================
5.6.1 Case Statement
|case E of |/Pattern_1/| then |/S1/|
[] |/Pattern_2/| then |/S2/|
[] ...
else |/S/| end|
All variables introduced in /Pattern_i/ are implicitly declared,
and have a scope stretching over the corresponding /Si/.
5.6.2 Semantics
Let us assume that expression |E| is evaluated to |V|. Executing the
case statement will sequentially try to match |V| against the patterns
/Pattern_1/, /Pattern_2/, ...,/Pattern_n/ in this order.
Matching |V| against |Pattern_i| is done in left-to-right depth-first
manner.
[...]
==============================================
Features of a record can be thought of as sorted lexicographically, see
http://www.mozart-oz.org/documentation/tutorial/node3.html#label20
In your case with R = f(a _ c) = f(1:a 2:_ 3:c) we have
{Arity R} = [1 2 3]). Thus left-to-right means that the matching
against the value for feature 1 happens first, and this may block.
HTH,
Andreas
_________________________________________________________________________________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users