Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[REBOL] Re: Obscure? You be the judge!

From: joel:neely:fedex at: 14-May-2002 7:57

Hi, Volker, Thanks for the explanations. As Larry Wall said: Just because something is obviously happening doesn't mean that something obvious is happening. ;-) However, I'm still left with a puzzled look on my face over one aspect of this... Volker Nitsch wrote:
> Hi Joel, > > >> a: context [ b: [1]] > >> c: make a[] > >> d: make a[] > >> same? a/b c/b > == false > >> same? c/b d/b > == false > > when you 'make an 'object!, all strings, blocks and functions are > copied. > that allows for example in 'layout : > box with[append init[my-inits]] > without destroying the original in box. > also blocks, like functions, are rebound. > so [make child-proto []] gives a copy of 'dataref, not the original. > but objects are not copied, > so the 'face/feel are all the same after [make face[]]. > or in your case,
(Oh, by the way, did you find this documented anywhere, did you just figure it out for yourself, or is there another path to enlightenment? ;-) Thanks to your explanation, I have a more compact example... gub?: make object! [ data: [1] proto: make object! [ number: 0 dataref: data speak: func [] [print [number mold dataref]] ] things: [] append things make proto [number: 1] append things make proto [number: 2 dataref: data] tweak-n-speak: func [blk [block!]] [ insert data blk foreach thing things [thing/speak] ] ] ...which behaves as follows...
>> gub?/tweak-n-speak ["OK,"]
1 [1] 2 ["OK," 1] My remaining puzzlement is over this contrast: If I accept the description that (during the construction of GUB?/PROTO) GUB?/DATA is copied and GUB?/PROTO/DATAREF is set to refer to the copy, then that explains the behavior of GUB?/THING/1 . However, during the construction GUB?/THING/2 the additional spec block *also* refers to GUB?/DATA , but apparently the copy behavior does *not* occur (even though the referenced data value is still only a block). This makes me wonder if the issue here is a difference in the evaluation of the specblock parts of make object! [...specblock...] vs. make some-object [...specblock...] This is uncomfortably reminiscent of FORTH, in which one must have a complete operational model of the interpreter's internal state if one is to understand the behavior the more advanced (and hence more useful) aspects of the language. At least FORTH had both liberal documentation and available source to help with the construction/communication of such an operational mental model... -jn- -- ; Joel Neely joeldotneelyatfedexdotcom REBOL [] do [ do func [s] [ foreach [a b] s [prin b] ] sort/skip do function [s] [t] [ t: "" foreach [a b] s [repend t [b a]] t ] { | e s m!zauafBpcvekexEohthjJakwLrngohOqrlryRnsctdtiub} 2 ]