adding set-words to a context from outside
[1/5] from: arolls::idatam::com::au at: 12-Oct-2001 18:15
Does anyone know how to add words to an object from outside that object? For example, take an empty object o: o: context  ; Now some voodoo stuff happens ; here that adds a word to o ; and the result... probe o make object! [ a: none ] And if you want to know why I want to do this... I am at work and cannot remember. :) Anton.
[2/5] from: ingo:2b1 at: 12-Oct-2001 11:06
Hi Anton, try Once upon a time Anton Rolls spoketh thus:
> Does anyone know how to add > words to an object from outside
<<quoted lines omitted: 3>>> ; Now some voodoo stuff happens > ; here that adds a word to o
o: make o [a: none]
> ; and the result... > > probe o > > make object! [ > a: none > ]
But remember, that 'make doesn't create deep copies, so you might run into some surprises, if you tried to assign this to another word. But setting it back to the same is safe. kind regards, Ingo
[3/5] from: media:quazart at: 12-Oct-2001 8:27
Hi, sorry for butting in... but if you do: obj_a: make object! [ attrib1: 1 ] obj_ptr: obj_a obj_b: make obj_a [ attrib2: 2 ] Am I right in saying that obj_ptr still references obj_a which only has one element? so is there a way to "grow" an object? cause in some circustances, you cannot replace all references to an object (especially when code is dynamic and there is no way to know how many references exist). -Max ---------------------------------- Maxim Olivier-Adlhoch
[4/5] from: rotenca:telvia:it at: 12-Oct-2001 16:22
> sorry for butting in... > but if you do:
<<quoted lines omitted: 10>>> cannot replace all references to an object (especially when code is dynamic > and there is no way to know how many references exist).
no, but you can use a method to emulate the growth, here it is: obj_a: make object! [ attrib1: 1 ] obj_ptr: obj_a obj_b: make obj_a [ attrib2: 2 ] obj_a/self: obj_b ;<- To "transparent" access the grown object, you must always refer the fields of obj_a with 'self: probe obj_a/self/attrib1 probe obj_a/self/attrib2 The drawback is that obj_a always remains in memory. Another method is to put all the objects to grown in a block and refers to them always with the block name: bl: reduce [ make object! [ attrib1: 1 ] ] obj_a: does [bl/1] get in obj_a 'attrib1 bl/1: make bl/1 [attrib2: 2 ] get in obj_a 'attrib2 You can make it with another object:
>> oo: context [o1: context [a: 1]] >> oo/o1/a
>> oo/o1: make oo/o1 [b: 2] >> oo/o1/a
== 2 You must never resolve the pointer to o1.
--- Ciao Romano
[5/5] from: ingo:2b1 at: 12-Oct-2001 17:03
Hi Maxim, you are right, obj_ptr will stay pointing at the initial obj_a, as far as I know, there is no possibility to grow an object (yet?).
>> obj_a: make object! [
[ attrib1: 1 [ ]
>> obj_ptr: obj_a >> obj_a: make obj_a [
[ attrib2: 2 [ ]
>> probe obj_ptr
make object! [ attrib1: 1 ]
>> probe obj_a
make object! [ attrib1: 1 attrib2: 2 ] Ingo
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted