Thanks Joel!! Please ignore (I know...too late) my previous message... Anyway, there is still one piece of the puzzle missing.. >> a: "test" == "test" >> b: a == "test" >> print b test >> b: "hello" == "hello" >> print a test Here, when you set word 'b to 'a, I assume that 'a is dereferenced and then a copy of that reference is placed in b. So now both 'b and 'a should point to the same structure. Now when I set 'b to "hello", I change the address of the variable 'b to point to a new structure. oops...never mind...this is all making perfect sense now!!! So, here is a third attempt (third time is a charm...right?) to generalize how addresses and values work in rebol: All series! datatypes are treated as references and all other datatypes (numbers, dates, etc..) are treated as values. Has anyone confirmed this? I know I am not supposed to snoop around and figure out how this stuff works in REBOL, but it is just something I have to know... Rishi Previously, you ([EMAIL PROTECTED]) wrote: > Hello, Rishi! > > [EMAIL PROTECTED] wrote: > > > > ok. I think I get it now. Everything is basically done as a > > reference. Even setting words. This is much simpler than what > > I was thinking :-) > > > > Well... maybe not! > > > > > ei: > > > > a: 5 > > b: a > > > > in this example, b is a reference to a (right?). > > > > Not as I understand it. In the second line, the expression > > a > > is evaluated, yielding the value of 5. A copy of that value is > bound to b (in the current context) by > > b: > > Note: When I said "a copy" above, I wasn't pretending to know how > the REBOL interpreter works. I was trying to emphasize that all > copies of 5 are interchangeable. > > > > > The thing that > > was confusing me was that the copy function doesn't always create > > a new copy. In deep series, it creates a reference to copied value > > ....strange... > > > > I think you're talking about the difference between > > b: copy a > > and > b: copy/deep a > > (If I'm mistaken here, please let me know!) The issue is that > series values are dealt with "by reference" so that one can do > > >> a: ["This" "is" "a" "test"] > == ["This" "is" "a" "test"] > >> b: a > == ["This" "is" "a" "test"] > >> change next b "was" > == ["a" "test"] > >> a > == ["This" "was" "a" "test"] > > The word a contains a reference to the literal, four-string > series in the first line. The second line binds to b a copy > of the value of a , which means that b now has a copy of > that reference. Since both of these references are to the same > data structure, changing the state of that structure (through > either reference) is visible via either/both. > > Now consider one-level copying. With > > >> a: ["This" "is" "a" "test"] > == ["This" "is" "a" "test"] > >> b: copy a > == ["This" "is" "a" "test"] > >> change next b "was" > == ["a" "test"] > >> a > == ["This" "is" "a" "test"] > >> b > == ["This" "was" "a" "test"] > > it is (I hope) clear that THE BLOCK ITSELF was copied, not merely > a reference to it. But... what does the block contain? Well, it > contains four references! Blocks and strings are both series > values, which are handled via reference. So changing the value > to which b refers (as in the above example) doesn't affect > the value to which a refers, BUT going one level deeper and > changing a string (series value) to which both the (block) value > of a and the (block) value of b refer will again be visible > via either of the second-level references. Continuing after the > interaction above, we can do > > >> change/part skip b/1 2 "at" 2 > == "" > >> a > == ["That" "is" "a" "test"] > >> b > == ["That" "was" "a" "test"] > > The way to ensure against such hidden connections is to do a deep > copy, which recursively copies nested series values. > > >> a: ["This" "is" "a" "test"] > == ["This" "is" "a" "test"] > >> b: copy/deep a > == ["This" "is" "a" "test"] > >> change next b "was" > == ["a" "test"] > >> a > == ["This" "is" "a" "test"] > >> b > == ["This" "was" "a" "test"] > >> change/part skip b/1 2 "at" 2 > == "" > >> a > == ["This" "is" "a" "test"] > >> b > == ["That" "was" "a" "test"] > > After which we can see that > > >> same? a b > == false > >> same? a/4 b/4 > == false > >> same? a/4/1 b/4/1 > == true > >> same? a/4/1 b/4/4 > == true > > because two strings that spell the same word are not necessarily > the SAME string. You can distinguish them by modifying one of them, > and seeing whether the other is modified. However, any two copies > of the letter #"t" are the same, because there's not any way to > "reach inside" it and modify one of its parts. > > > > > By the way, is there any way to prove that b is a reference to a > > (in the above example) ? I know you can do it if you set the value > > of as a series datatype (by using insert or other series function). > > But how do you prove that b references a for number datatypes? > > > > It doesn't. If you wanted to prove that it did, you'd need to be > able to modify a part of a numeric value in-place and show the > change propagating. However, REBOL also does some other tricky > things in that regard. Consider: > > >> a: 1-Jan-2000 > == 1-Jan-2000 > >> b: a > == 1-Jan-2000 > >> same? a b > == true > >> b/2: 10 > == 10 > >> b > == 1-Oct-2000 > >> same? a b > == false > >> a > == 1-Jan-2000 > > Even though you can modify a component of a date value, doing do > does not propagate. Therefore, one would conclude that the two > date values are considered the same because they are being tested > by value, rather than by reference. This is consistent with the > results below: > > >> same? "test" "test" > == false > >> same? 1-Oct-2000 2000/10/01 > == true > > At this point, one would need to do similar tests for all REBOL > datatypes to completely answer your question. The description > of copy (with respect to the /deep refinement) leaves > the impression that anything under the series! pseudotype > would be a "reference", however. > > >> series? ["This" "is" "a" "test"] > == true > >> series? "test" > == true > >> series? 1-Oct-2000 > == false > > The best advice I can give you is to forget the concept of "address" > that you may have from assembler, C, or any other low-level language. > There just isn't any way to get at the "storage location" associated > with a "variable" in REBOL -- in fact, I quoted those phrases just to > emphasize that I'm speaking a foreign language here! Those concepts > don't even exist in REBOL! > > -jn- > >