HI Fantam

The problem is that the word 'member inside the block referenced by 'code is
bound to the global context when the script is loaded, and it remains so
when the "do code" is executed inside the foreach loop.  However,

foreach member block [...]

creates a local variable, also called 'member which will be set (bound)
successively to the items contained in 'block. The name of the iterator
variable is irrelevant to the problem.  You will get the same problem if you
say

foreach x block [...]

because the local variable 'member is never used in the foreach body block.

You can use the function 'bind to bind the words in the external (to the
function foreach) 'code block to the local context of the foreach function
by binding the block to the local variable 'member.

>> block: ["a" "b" "c"]
== ["a" "b" "c"]
>> code: [print member]  ;context for member made here, value given later
== [print member]
>> member: 5
== 5
>> foreach member block [do code]
5
5            ;member in code bound to global context
5
>> foreach member block [do bind code 'member]
a
b            ;member in code bound to local var member
c

The latter gives the same result as moving the 'code definition inside the
foreach loop.

>> foreach member block [code: [print member] do code]
a
b
c

Some caution is necessary when using advanced functions like bind.  For
instance, in a more general case than yours, there might be some words in
the external block that need to retain the values of their global binding
despite the fact that those words are also used locally in the calling
function and others that need to be rebound to the calling function's local
context.  In such a case, using bind as above will not give the desired
effect.

The thing to remember is that words have values only within a context, and
the same word may have different values in different contexts.

HTH

-Larry

----- Original Message -----
From: <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, August 13, 2000 8:39 AM
Subject: [REBOL] word


>   I am confused. Consider this small script:
>
> REBOL []
>
> block: ["a" "b" "c"]
> code: [print member]
> foreach member block [do code]
>
> Upon execution, I get :
>
> ** Script Error: member has no value.
> ** Where: print member
> >>
>
> I guess I have to use 'bind or 'use somewhere, but I'm not sure which
> and how.
>
> Thanks for your help
> --
> Fantam
>
>

Reply via email to