Yeah could be the beers, when I said clone… I meant clone.

Thanks for the interest though. cwright replied to me privately at one point
so the conversation may have got confusing. I got into the muddle because i
was trying to avoid duplicating the whole structure 'by hand' and then I
tried just editing the data I I wanted to. I assume editing the Input
Structure receving the structure from the first JS patch (and thus avoiding
a duplication loop) was a no_no, but I'l try it just to see.

Best
Alastair

2010/4/12 Boštjan Čadež <[email protected]>

> for some reason (prolly the couple of beers i had) i think you got some
> terminology mixed up. what do you mean when you say clone? for me a clone
> would mean a copy, which in this case would be a good thing. you can edit a
> copy. the problem you encountered happens with references. to be sure of
> what im trying to say ill go into to much detail.
>
> lets say you have a structure like (in this case an object):
>
> poo={};
> poo.color="brown";
> poo.weight=2.3;
> poo.shape=["sphere","sphere","cylinder"];
>
> lets say you have this in one JS patch and output it to another one via
> noodle. in the one that receives you have:
>
> pooCopy=poo;
> pooCopy.weight=2.1; FAIL
>
> this doesnt work because "pooCopy=poo;" just copies the memory address (a
> number) for the object (aka reference) not the whole object (many numbers).
> so "pooCopy.weight=2.1" still tries to change the object you cant change,
> because inputs are read only.
>
> second try:
>
> pooCopy={};
> pooCopy.color=poo.color;
> pooCopy.weight=poo.weight;
> pooCopy.shape=poo.shape;
>
> pooCopy.color="grey";
> pooCopy.weight=2.1;
> pooCopy.shape=["sphere","sphere","sphere"];  this works
>
> but if you tried this instead:
>
> pooCopy.shape[2]="sphere";  FAIL
>
> this is because poo.shape is an object also. and "pooCopy.shape=poo.shape;"
> puts a reference for poo.shape at pooCopy.shape which you cant change
> because its read only.
>
>
>       pooCopy={};
>       pooCopy.color=poo.color;
>       pooCopy.weight=poo.weight;
>       pooCopy.weight=[];
>       for(var i=0;i<poo.shape.length;i++)
>       {
>             pooCopy[i]=poo[i];
>       }
>
> this would do the job. basically, you have to copy each property of an
> object of an object of an object / element of an array of an array of an
> array "by hand".
>
> i once found a recursive function that would add the copy ability to the
> object prototype, but that does ugly stuff to the output ports.  IMHO its
> better to make your own copy function for your custom structure, or in the
> case above, make just one javascript patch and avoid the copying.
>
> p.s. beer makes me talk to much;)
>
>
> On Apr 11, 2010, at 5:21 PM, Alastair Leith wrote:
>
> Yes okay, so I can do this kind of iteration in the main function (often I
> do it that way but sometimes in a function call) and still get cloning not
> referencing right?
>
> Yeah an old screen shot saved me on my last project ;) One day I would like
> to get to the bottom of that. I was able to write the JS in a fresh patch
> carefully testing for parsing as I went and I got it functioning but the
> exact same text was jamming in another JS patch no matter how much I retyped
> it. I feel the JS patch is a little illogical at times (as in it gets
> broken), if that's a good way to put it.
>
> Oops, yes recursive is what I meant but it seems to be a regressive move in
> JS too.
>
> On 12 April 2010 01:12, Alastair Leith <[email protected]> wrote:
>
>>
>>
>> ---------- Forwarded message ----------
>> From: Alastair Leith <[email protected]>
>> Date: 12 April 2010 01:06
>> Subject: Re: Javascript issue modifying a structure (again… :/)
>> To: Christopher Wright <[email protected]>
>>
>>
>> Yes that helps heaps. Thanks cwright. I kind of twigged to the referencing
>> thing a few weeks back but didn't really extrapolate the general rule (I was
>> getting some strange results!) and still not 100% sure I have yet. So…
>>
>> Does the function you wrote also assign individual item references back to
>> the original structure? If they are *values* and not *references* put
>> into *newObj*, is that distinction because of the call to another
>> function or just the iterating through at the lowest child level of the
>> structure? If items had sub-items would I need to iterate though sub-items
>> (in more function calls ? regressive function calls are out in JS aren't
>> they?)?
>>
>> So many questions! I'm really grateful for your help already though,
>> thanks again.
>>
>> Alastair
>>
>> I guess the downside of a loosely typed language like JS when your trying
>> to teach yourself scripting (that's me btw ;) ) is that things can get a
>> little slippery and not generate meaningful error mesages...
>>
>> On 12 April 2010 00:49, Christopher Wright <[email protected]> wrote:
>>
>>>  If anybody could identify my misconception here I be very grateful:
>>>>
>>>
>>>
>>> You're assuming that you can modify inputs -- you can't.
>>>
>>> You're assuming that JS copies by value -- it doesn't (it copies by
>>> reference).
>>>
>>> So, when you assign glyph to an input:   glyph = glyphs[cursor];
>>> glyph is a reference to the input -- trying to modify that will fail.
>>>
>>> You need a copy function, as follows:
>>>
>>> function copy(obj)
>>> {
>>>        var newObj = new Object();
>>>        for(var e in obj)
>>>                newObj[e] = obj[e];
>>>        return newObj;
>>>
>>> }
>>>
>>> cursor = 5;
>>> function (__structure Glyphs_Out, __boolean Same, __string Font,
>>> __structure Glyph)
>>>        main (__structure Glyphs_In)
>>> {
>>>        var result = new Object();
>>>        var glyph = new Object();
>>>        var glyphs = new Array();
>>>        var font = new String();
>>>        font = "LucidaGrande";
>>>        if (!_testMode)
>>>        {
>>>                glyphs = Glyphs_In;
>>>                glyph = copy(glyphs[cursor]);
>>>
>>>
>>> //              This line works:
>>>                font = glyph.Font_Name;
>>>                glyph.Font_Name = font;
>>>                glyph.Y +=0.1;
>>>                // Can't modify inputs, so you'll have to copy some other
>>> inputs too.
>>>                //glyphs[cursor]["Y"] +=0.1;
>>>
>>>
>>>                result.Font = font;
>>>                result.Glyph = glyph;
>>>                result.Glyphs_Out = glyphs;
>>>                return result
>>>        }
>>> }
>>>
>>> Hope that helps! :)
>>>
>>> --
>>> [ christopher wright ]
>>> [email protected]
>>> http://kineme.net/
>>>
>>> --
>>> [ christopher wright ]
>>> [email protected]
>>> http://kineme.net/
>>>
>>>
>>
>>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Quartzcomposer-dev mailing list      ([email protected])
> Help/Unsubscribe/Update your Subscription:
>
> http://lists.apple.com/mailman/options/quartzcomposer-dev/fskolog%40gmail.com
>
> This email sent to [email protected]
>
>
> lp,
> fšk
>
>
>
>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to