views:

235

answers:

3

I'm trying to create a list in Oz using the following code:

local Loop10 Xs in
   proc {Loop10 I}
      Xs={List.append Xs I}
      if I == 10 then skip
      else
     {Browse I}
     {Loop10 I+1}
      end
      {Browse Xs}
   end
{Loop10 0}
end

The Mozart compiler shows that the code is accepted, but no Browse window opens up. All I'm trying to do is create a list in Oz.

What's wrong with the code?

A: 
Xs={List.append Xs I}

In Oz you can't assign new values to variables like this.

starblue
how would I go about creating and appending elements to a list?
el diablo
+1  A: 

Not sure that that's what you want, but to create a list of all whole numbers between X and Y (inclusive) you could do:

local
   fun {Loop From To}
      if From == To
      then [From]
      else From | {Loop From+1 To}
      end
   end
in
   {Browse {Loop 0 10}} % Displays: [0,1,2,3,4,5,6,7,8,9,10]
end
sepp2k
Thanks. I actually stumbled upon the same method myself. Although in order to return a proper list the second argument to Loop must be To|nil so that the list is always terminated with a nil.thanks.
el diablo
Oh, you're right. It's fixed now.
sepp2k
A: 

Also the reason why you don't get any browser window is because the evaluation thread suspend due to this line:

Xs={List.append Xs I}

As it was previously mentioned a variable can only be assigned once but there is something else that is wrong with this line. You attempt to append Xs to I but Xs is still unbound. The thread thus suspends until a value has been assign to Xs.

Enter this interactively:

declare Xs in
{Browse {List.append Xs [2 3 4]}}

As you see nothing happens, no browser opens. Now enter this:

Xs= [1]

Since Xs becomes bound it unlocks the first evaluation "thread" and the browser will pop-up.

P.S. Sorry for the late answer, I just got interested in Oz :P

JFT