[REBOL] Re: is block a block?
From: brett::codeconscious::com at: 30-Nov-2000 17:21
> >>probe obj_1
>
> make object! [
> name: "mascha"
> ]
> >>foreach obj [ obj_1 obj_2][
> probe obj/name
> ]
> ** Script Error: Cannot use path on word! value.
> ** Where: probe obj/name
> ooops
This is just one block with two words in it. These words happen to have
values, but remember in Rebol (check the guide) the block is not evaluated
immediately. The block is only evaluated when a function processes it. For
example,
>> obj_1: make object! [
[ name: "mascha"
[ ]
>> obj_2: make object! [
[ name: "mascha2"
[ ]
>>
>> foreach obj reduce [ obj_1 obj_2 ] [ print obj/name]
mascha
mascha2
What did reduce do just then? It took a block with two words in it,
individually evaluated each of the words and returned the results in a new
block. Each word evaluted to the object it refers to. So you end up with a
block of two objects which is then given to the foreach function.
> >>b: []
> >>insert b obj_1
> >>insert b obj_1
...
> >>foreach obj b[
> [ probe obj/name
> [ ]
> "mascha"
> "mascha"
> == "mascha"
So here you gave foreach a block that contains two objects (not two words).
This is different from before because of the way you constructed the block
b. First you made a block and inserted the objects into it - guaranteeing
that the block contained the actual objects.
> since also
> >> equal? [obj_1 obj_1] b
> == false
Yes, a block of two words is not the same as a block of two objects.
> but
> >> equal? length? [obj_1 obj_1] length? b
> == true
The lengths of each happen to be the same, that is 2.
This is like asking
>> equal? length? ["the price" "of fish"] 2
== true
> >> equal? type? [obj_1 obj_1] type? b
> == true
Yup, they are both blocks - two different blocks - but definitely two
blocks. Again, the words here are simply being treated as literally the
words obj_1 and obj_2. These two words in this case have not been evaluated.
>> type? [obj_1 obj_2]
== block!
>> type? []
== block!
>> type? [a block full of words with no value]
== block!
>> length? [ a block of length x of meaningless words]
== 8
>> length? [ a block of length 8 of meaningless words]
== 8
Another way of saying this is that
[obj_1 obj_2] is a block of two words. The first word is obj_1, the
second is obj_2.
Nothing more is said. It doesn't matter that you have defined obj_1 and
obj_2 to have values earlier. These values are not accessed until you
evaluate the words (find their value/meaning) by using a function.
Now look at this
two-object-block: reduce [obj_1 obj_2]
This says reduce the block of words to a block of values by evaluting each
word. When done, set the word "two-object-block" to refer to this new block
of values (objects).
So then these work:
>> get in first two-object-block 'name
== "mascha"
>> two-object-block/2/name
== "mascha2"
Hope it helps.
Brett.