Hi, Mark,

[EMAIL PROTECTED] wrote:
> 
> Surely this is incorrect?
> 
> >> a: has [b c] [ print b print c]
> >> a
> none
> none
> >> a/local 3 4
> 3
> 4
> 
> Surely local words default value should be unset
> until they are defined?
> 
> Also in the second case is it correct to be
> able to pass values to local words in this manner?
> 

I think you answered your own question; adding the LOCAL
refinement appears to invite A to set its locals as if
they were ordinary "optional" refinement args.  As
additional evidence, note this

  >> a: has [b c] [ print b print c]
  >> source a
  a: func [/local b c][print b print c]
  >> a
  none
  none
  >> a/local 17
  ** Script Error: a is missing its c argument
  ** Where: halt-view
  ** Near: a/local 17
  >>

>
> How is the above different from this....
> 
> >> use [b c] [print b print c]
> ** Script Error: b has no value
> ** Near: print b print c
> 
> Can somebody please explain the wisdom of this
> or is it a bug?
> 

Neither wisdom nor bug, just a different mechanism;
USE creates a context containing the word(s) from its
first argument, then evaluates the expression(s) from
its second argument in that new context.  Since your
sample didn't do anything to initialize B and C in that
new context, they had no values.

(Actually, USE also has a side effect -- it modifies its
 second argument so that words named in the first argument
 are bound to the new context.  That explains the following
 bit of behavior:

  >> thing: [print b print c]
  == [print b print c]
  >> b: "Hello, "
  == "Hello, "
  >> c: "world!"
  == "world!"
  >> do thing
  Hello,
  world!

Presumably there's no surprise there.

  >> use [b c] [
  [    b: 1
  [    c: 2
  [    do thing
  [    ]
  Hello,
  world!

If there's surprise here, recall that only occurrences of B
and C *within* the second argument of USE are re-bound to the
new context.  Therefore THING still contains the global B and
C words.

  >> use [b c] thing
  ** Script Error: b has no value
  ** Where: halt-view
  ** Near: print b print c

No surprise here, because the new B and C never got initiliized.

  >> do thing
  ** Script Error: b has no value
  ** Where: halt-view
  ** Near: print b print c

If there's surprise here, recall that USE rebound occurrences
of B and C within THING to the new context.  Therefore, THING
no longer contains references to the global B and C.

HTH!

-jn-

-- 
"This sentence contradicts itself -- no actually it doesn't."
-- Doug Hofstadter
                              joel<dot>neely<at>fedex<dot>com
-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to