[chuck-users] zipper noise (++)

Ge Wang gewang at CS.Princeton.EDU
Fri May 5 00:36:57 EDT 2006


Hi Kassen and all!

> "need" is a big word but if you would have a moment to spare I would 
> very much apreceate your thoughts on some of the issues around those 
> asignments of ugen's to array members.

The current specification for arrays of Objects is that each element is a
reference, like a non-array Object variable, can be treated as such.

For example, as you know:

   Object foo;
   Object @ bar;

At this point, both foo and bar is a reference variable to an Object, the 
only different being foo is referencing an instance of Object, whereas bar 
is referencing NULL at this point.

assignment:

   // assign foo to bar: both now point to the same instance
   foo @=> bar;

Going to arrays isn't really any different:

   Object fooray[10];
   Object @ barray[10];

fooray simply contains 10 references (each referencing at this point to 
newly allocated Object instances), barray also contains 10 references, but 
due to the @ declaration all elements are NULL.  Except for this 
difference, fooray and barray are the same: they both contain references 
to Objects.

If we want, we can assign references to the elements of fooray and barray:

   // assuming fooray.cap() == barray.cap()
   for( int i; i < fooray.cap(); i++ )
       fooray[i] @=> barray[i];

This above fills barray's elements with corresponding elements of fooray.

We can also assign new instances to fooray's elements and to barray's 
elements:

   // make a new Object (reference variable obj)
   Object obj;
   obj @=> fooray[0];
   obj @=> barray[2];

   // make a new Object
   new Object @=> fooray[4];
   new Object @=> barray[5];

The objects, in theory, are reference counted and garbage collected as 
appropriate.  In practice, the garbage collection system is not finished 
(completing it is actually the main goal, along with string manipulations, 
of the 1.2.0.6 release).  In the cases above, it actually works, I think.

In the case of UGens, it's no different really, except the @=> and => 
operators do completely different things.  As Perry explained:

   UGen foo;
   UGen bar;

   foo => bar; // connects foo to bar, as we all know
   foo @=> bar; // assigns foo to bar

In the 'foo @=> bar;' case, bar now references the same UGen as foo. 
What bar was previously referencing should have it's reference count 
decremented and be potentially garbaged collected.

Things get potentially kind of wacky is when we combine @=> and => into a 
single statement, like:

   // make an array (all elements == NULL, due to @)
   sinosc @ bank[N];

   // make new sinosc, assign it to bank[0], connect it to dac
   sinosc s @=> bank[0] => dac;

Like Perry wrote, this decomposes into the following lines:

   // make new sinosc
   sinosc s;
   // assign it
   s @=> bank[0];
   // connect bank[0] to dac
   bank[0] => dac;

The thing to remember is @=> always signifies assignment, => depends on 
the context.

And that's pretty much it.  I am actually still not sure if I answered the 
right question - please let me know...  Doh.  If this part of the language 
seems confusing, we can certainly try to improve it.

Best wishes, Kassen and all.

Ge!


More information about the chuck-users mailing list