Thanks Romano

I am working on your material. I hope to be able to release my "'bind for
dummies" soon.

Patrick
----- Original Message -----
From: "Romano Paolo Tenca" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, March 07, 2002 5:40 PM
Subject: [REBOL] Re: [understanding 'bind]


> Hi, Pat
>
> Object creation in Rebol it is a little "strange". The first times i
looked at
> Rebol, I read the collowing code:
>
> make object! [
>      a: 1
>  ]
>
> like: "create an object and set its field 'a at 1".
>
> Today I read the code in another mode:
>
>  1) create a new context with the word 'a and the word 'self
>  2) assign to the value of 'self in this new context a pointer
>      to a representation of the new context (an object! datataype)
>  3) bind the user block to the new context
>  4) evaluate the user block
>  5) return the value of the local word 'self
>
> There is little difference between an use block and an object creation:
>
> use [a] [
>      a: 1
>  ]
>
> can be read:
>
>  1) create a new context with the word 'a ()
>  2) ()
>  3) bind the user block to the new context
>  4) evaluate the user block
>  5) return the (result of  the evaluation)
>
> I've put some parens to signal the where are changes. As you can see, the
> changes are for the local 'self and the result, but both 'use and 'make
> object! do 3 things:
>
>  1) create a context
>  2) bind a block to it
>  3) evaluate the binded block
>
> 'bind simply overrides the value of the words in the block with the value
of
> the words in the local context. If a word is not defined in the local
context,
> it conserve its previous context (if any) and its previous value (if any).
>
> To be more precise: 'bind discards the old word and put in your block a
new
> word, bound to the new context.
>
> A word cannot be changed at all. It is like 10. You can put 2 where one
time
> there was 10, but you can't change 10 to make it 2.
>
> Also set-words cannot be changed at all:
>
>     a: 6
>
> does not means:
>
>     "change the value of a"
>
> it means:
>
>   "change the value which the context of 'a assigns to the symbol 'a"
>
> 'Set changes the context not the word.
>
> One consequence is that you can pass a word from a block of code to
another
> without changing its binding. In other words: you can use a word of
another
> context in the "actual" one.
>
> The function behaviour is a little different:
>
> func [a][a: 1]
>
> can be read:
>
>  1) create a local context with the word 'a ()
>  2) ()
>  3) bind the user block to the new context
>  4) ()
>  5) return (a pointer to the function code)
>
> The binded block is NOT immediately evaluated, it will be evaluated only
when
> the 'func result (the function! datatype) will be evaluated. There are
others
> differences, like the args stuff, the default value of local words (=none!
> instead of unset!) but for the binding it is all. We can think to a
function
> like a delayed 'use block: the evaluation - not the bind - is delayed.
>
> Now to your code:
>
> > o: make object! [
> >  print: func [b [block!]][rebol/words/print compose ["o-print-> " (b)]]
> >  test1: does [print ["test"]]
> >  test2: func [b [block!]][do b]
> >  test3: func [b [block!]][do bind b 'self]
> > ]
> >
> > o/test1
> > o/test2 [print ["Hello World!"]]
> > o/test3 [print ["Hello World!"]]
>
> In the object 'o appears the set-word print:, it becomes a word of the new
> local context.
> Every occurrence of the word 'print in the body block will be bound to the
> local context: that 'print in test1 will become a local word. Then Rebol
> evaluates the code of the object block, which creates the function test1.
Its
> body is binded the the local context of the function, which in this case
does
> not contain the word 'print, the word print is unchanged and remain bound
to
> the previous context (the object context).
>
> When you invoke o/test1, will be evaluated the word 'print, bound to the
> object context.
>
> When you invoke o/text2, with the block [print ["Hello World!"]], the word
> 'print in this block is by default bound to the global context. The
funtion
> test2 executes this block without any changes, so the value of 'print will
be
> the same of the global 'print.
>
> The funtion test3, instead, binds this block the object context (addressed
> with 'self); this context contains the word 'print, so the value of 'print
> changes and becomes the same of the local function 'print.
>
> Hope this help.
>
> ---
> Ciao
> Romano
>
>
> --
> To unsubscribe from this list, please send an email to
> [EMAIL PROTECTED] with "unsubscribe" in the
> subject, without the quotes.
>

 
______________________________________________________________________________
ifrance.com, l'email gratuit le plus complet de l'Internet !
vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
http://www.ifrance.com/_reloc/email.emailif


-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to