[REBOL] Re: What does "loop" return?
From: valeri:mytinski:gm:ail at: 5-Apr-2009 20:17
05.04.2009, =D7 15:42, Henrik Mikael Kristensen =CE=C1=D0=C9=D3=C1=CC(=C1):
> 2009/4/5 =F7=C1=CC=C5=D2=C9=CA =ED=D9=D4=C9=CE=D3=CB=C9=CA
> <valeri.mytinski
> -gmail.com>:
>>
>>
>> 05.04.2009, =D7 10:34, Graham Chiu
>> =CE=C1=D0=C9=D3=C1=CC(
> =C1):
>>
>>>
>>> If you wish to create a new empty block each time, you would do
>>> this > 20
>>
>>> instea=3D
>>> d
>>>
>>> loop 2 [ append copy [] 3 ]
>>>
>>> which would be the same as
>>>
>>> append [ ] 3 append [ ] 3
>>>
>>> Graham Chiu
>>
>>
>> Thanks for this example.
>> Sorry, now I understood nothing.
>>
>> Why
>>
>> loop 2 [append [] 3]
>>
>> is equivalent to
>>
>> append append [] 3 3
>>
>> that is some sort of "nested" expressions - result of first 'append =20
>> is
>> INSERTED as parameter for second 'append,
>>
>> while
>>
>> loop 2 [ append copy [] 3 ]
>>
>> is equivalent to
>>
>> append [ ] 3 append [ ] 3
>>
>> that is some sort of "sequence" expressions - first 'append is
>> FOLLOWED by second 'append? Why does not parameter substitution
>> done?
>
> You are entering a deep issue in REBOL, namely that certain values are
> aggressively reused and that REBOL works by copying as little data as
> possible by default to let it be very efficient. That might be a bit
> hard to understand at this point.
>
> Let's look at the loop:
>
> loop 2 [append [] 3]
>
> And strip the stuff in front of the block:
>
> [append [] 3]
>
> When you specify the loop like this, REBOL immediately recognizes the
> [] you specify as being literally the same memory position that APPEND
> should work on, each time it runs through the loop. This is very
> important to understand.
>
> In a sense the loop becomes self modifying. This is a neat trick that
> lets you avoid referencing the block from a word, but it can also be a
> nasty trap, if you don't realize this.
>
> So when you try this one:
>
> append [] 3 append [] 3
>
> You have two different blocks at two different memory locations.
>
> When you do a COPY, the block you work on is never the same, but
> always a c
> opy.
>
> This trick works everywhere, in blocks, loops, functions, etc. But be
> careful when you use it.
>
> REBOL has a function for testing the SAMEness of series/blocks, i.e.
> whether two series you are testing on, is the same one at the same
> memory location. It's called SAME?.
>
> --
> Regards,
> Henrik Mikael Kristensen
Thank you very much, Henrik!
Valeri
PS Do you know more tricks that anyone must know BEFORE start
real coding? :-)