There was a problem in your original code which might have confused you:

> [] [X] then  X|nil#Bool

This returns a (somewhat malformed) list with the tail "nil#Bool". In other 
words, # has a higher precedence than |.
What you really want here, is probably:

> [] [X] then  (X|nil)#Bool

An alternative syntax for the same thing is:
> [] [X] then  [X]#Bool

The same rules apply when using pattern matching.

Cheers,
  Wolfgang

Quirino Zagarese <[email protected]>:
> Thank you very much Raphael,
> I though only procedures could use parameters in that way.
> Now it's all clearer.
> Then what about matching whatever#true? Is there a way to do that(i.e. a
> character like % in SQL)?
> Regards
> 
> 2009/2/13 Raphael Collet <[email protected]>
> 
> > On Fri, Feb 13, 2009 at 12:18 PM, Quirino Zagarese <
> > [email protected]> wrote:
> >
> >> Hi,
> >> I'm new to Oz and I'm trying to write a simple function which take two
> >> arguments, a list and a boolean,
> >> and switches each couple of elements if they are not in ascending
> order.
> >> If no switch takes place, the function
> >> must return the initial_list#true otherwise the new_list#false.
> >> Here is my function:
> >>
> >> declare
> >> fun{SwitchAndTest Ls Bool}
> >>    case Ls of nil then nil#Bool
> >>    [] [X] then  X|nil#Bool
> >>    [] X1|X2|T then
> >>       if X1>X2 then  X2|{SwitchAndTest (X1|T) false}
> >>       else
> >>           X1|{SwitchAndTest (X2|T) Bool}
> >>       end
> >>    end
> >> end
> >>
> >> Running  {Browse {SwitchAndTest [1 3 2 4 5 6 8 7] true}}  returns
> >> 1|2|3|4|5|6|7|8|nil#false
> >> instead of [1 2 3 4 5 6 7 8]#false.
> >> It's a newbie question but I couldn't find any solution for now.
> >> Then is there a way to match such an expression in a case statement? I
> >> mean is there a way to write something like
> >>
> >> case {SwitchAndTest Ls true} of ANYTHING#false   so that it will match
> >> 1|2|3|4|5|6|7|8|nil#false ?
> >> Thanks in advance
> >>
> >
> > Split the function in two: one that takes care of the toplevel result
> > (list#boolean), and another one that builds the list and determines the
> > boolean.  The second function actually has two outputs: the list and the
> > boolean.
> >
> > fun {Switch L}
> >    B in {SwitchAndTest L B}#B
> > end
> >
> > fun {SwitchAndTest L ?B}
> >    case L of nil then B=true   nil
> >    [] [X] then B=true   [X]
> >    [] X1|X2|T then
> >       if X1>X2 then
> >          B=false   X2|{SwitchAndTest X1|T _}
> >       else
> >          X1|{SwitchAndTest X2|T B}
> >       end
> >    end
> > end
> >
> > Cheers,
> > raph

-- 
Jetzt 1 Monat kostenlos! GMX FreeDSL - Telefonanschluss + DSL 
für nur 17,95 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a
_________________________________________________________________________________
mozart-users mailing list                               
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users

Reply via email to