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

Reply via email to