Hi Ladislav,

1. first 'first

If I understand nonsame1 is equivalent to nonsame except if called with the
word 'first.

<<yoda>>

same? 'first nonsame1 'first
** Script Error: first has no value

<<L>>

So I have tried to find out the part of nonsame1 that breaks ...
In the following line from nonsame1, I see two parts :

 use reduce [word] reduce ['first reduce [word]]

or
 use <part 1> <part 2>

<part 1> being a block of words, here a block with only one word.
<part 2> being a block to evaluate. Evaluation returning the given word.

A little test shows that <part 1> is correct.

 >> myword: 'first
 == first
 >> reduce [myword]
 == [first]

Therefore I concentrate myself on <part 2>. To emulate <part 2> I create
this little function

 test: func [x [word!]][do reduce ['first reduce [x]]]

However I was desappointed with the result.

 >> test myword
 == first

No error, so neither <part 1> or <part 2> is responsible for the error. It
is only when they are bind together by use, that an error rises. I think
also there is nothing wrong with 'first by itself. To clear that, I have
made the following test where 'first is replaced by 'second.

 >> test2: func [word [word!]][use reduce [word] reduce ['second reduce
[word]]]
 >> test2 'second
 ** Script Error: second has no value

Bingo ! let's try to remove first ...

 >> test2: func [word [word!]][use reduce [word] reduce [reduce [word]]]
 >> test2 'first
 == [first]

It is almost ok, except that a block is returned instead of a word. And it
was indeed the purpose of using 'first to give us a word. A part that it
returns a block, test2 give us the right thing : a word with the same
spelling but not the same word.

 >> first test2 'first
 == first

Here we can get the "new" first with the same spelling.

 >> same? 'first first test2 'first
 == false

And it is not the same as the global first. From that it is easy to build
test3 which is indeed nonsame :

 >> test3: func [word [word!]][first use reduce [word] reduce [reduce
[word]]]
 >> test3 'first
 == first
 >> same? 'first test3 'first
 == false

2. second reduce

Let's play again with my simplification of use :

 use <part 1> <part 2>

where

<part 1> is a block including one word
<part 2> is a block returning that word

Why can't we simply write :

 test4: func [x [word!]][use [x][x]]

This is an answer

 >> use [x][x]
 ** Script Error: x has no value
 ** Where: do-boot
 ** Near: x

The x in part 2 exists but have never been set. It has no value to return.
In fact, we don't want the value of x but the word associated. May be this
could work.

 test4: func [x [word!]][use [x]['x]]

 >> test4 'first
 == x

Nope, 'x is taken litteraly here.

 test4: func [x [word!]][use [x][compose [('x)]]]

 >> test4 'first
 == [x]

 test4: func [x [word!]][use reduce [x][compose [('x)]]]

 >> test 'first
 == [first [first]]

Yeah, another puzzle: one in -> two out. However it is first that comes out.
So I think I understand the first reduce. Let's replace compose by reduce
too.

 test4: func [x [word!]][use reduce [x][reduce [x]]]

 >> test4 'first
 == [first]

Not bad ! but is it the real one ?

 >> same? 'first first test4 'first
 == true

No luck again. Indeed it says something. Since we get the global 'first, it
means that the use did not work at all.

This one is a bit tricky

 test5: func [x [word!]][use [first][reduce [x]]]

 >> test5 'first
 == [first]
 >> same? 'first test5 'first
 == false

It works, however it works only with 'first. It shows anyway that only <part
2> needs to be taken care of. Let's try to see what is wrong in that <part
2>.

 test6: func [x [word!]][use reduce [x][print reduce [x]]]

 >> test6 'first
 ** Script Error: first expected series argument of type: series pair event
money date object port
 time tuple any-function library struct event
 ** Where: test6
 ** Near: first

It seems that x is evaluated again. To prevent evaluation, it can be put in
an extra block.

 test6: func [x [word!]][use reduce [x][print [reduce [x]]]]

 >> test6 'first
 first

As we know that print reduces its argument, all we have to do is to replace
print by reduce.

 test7: func [x [word!]][use reduce [x][reduce [reduce [x]]]]

 >> test7 'first
 == [[first]]

And yet there is an external block to get rid of.


 test8: func [x [word!]][use reduce [x] reduce [reduce [x]]]

 >> test8 'first
 == [first]
 >> same? 'first test8 'first
 == false

And finally from what we learned from (1.).

 test9: func [x [word!]][first use reduce [x] reduce [reduce [x]]]

 >> test9 'first
 == first
 >> same? 'first test9 'first
 == false

Which is not a surprise because test9 is nonsame.

3. third contexts.html

I was very proud to see my name in the acknowledgements part. I show it to
everybody in the house except my cat.

4. fourth unbound

I noticed the replacement of error? by any-type? I will look into later,
because I have very few little grey cells available at the moment.

Patrick

----- Original Message -----
From: "Ladislav Mecir" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, March 17, 2002 8:44 AM
Subject: [REBOL] Re: [refactoring s-c?]


> Hi Pat,
>
> you are doing well, don't give up (use the source, Luke...), your mail is
> nice.
>
> <<Pat>>
>
> ...snip...
>
> Assertion 1 : nonsame returns a word bound to another context.
> Assertion 2 : this context is created by use.
> Assertion 3 : nonsame returns a word with the same spelling.
>
> ...snip...
>
> 2. From (1) I  have learned that use was required to create a new word
with
> the same spelling but different. As for comparing nonsame1 and nonsame, I
> have learned nothing. As far as I can tell they are equivalent :
>
> <</Pat>>
>
> NONSAME1 and NONSAME look so much equivalent, that it confused even me.
The
> only difference is the usage of 'first. That is the source of the trouble
in
> NONSAME1:
>
> same? 'first nonsame1 'first
> ** Script Error: first has no value
> ** Where: nonsame1
> ** Near: first [first]
>
> If we try this for NONSAME, we will get:
>
> same? 'first nonsame 'first
> == false
>
> <<Pat>>
>
> ...snip...
>
> 3. Why reduce ? I have still no idea,
>
> ...snip...
>
> <</Pat>>
>
> Just in case you need it, here is the reason for REDUCE:
>
> word: 'a
> block1: [word]
> block2: reduce [word]
> block3: reduce [[word]]
> block4: reduce [reduce [word]]
>
> <<Pat>>
>
> ...snip...
>
> 5. Epilogue
>
> Learning that I know nothing is indeed a valuable lesson. Knowing that is
> certainly better than pretending to know something that I don't. I don't
> know if I am ready for understanding the truth. It is not for the
apprentice
> to decide. I have spent half my day with all these trials and must return
> now to a normal life !  Hoping for the best
>
> Patrick
>
> <</Pat>>
>
> Nice epilogue :-) My feelings are similar, because my implementation of
> S-C?, although pretending to be correct, was in fact incorrect. Hope the
> trial and error didn't exhaust you too much. Now it should be clearer, but
> feel free to ask, if anything remains unclear.
>
> Best regards
>     L
>
> P.S. The newest version of [Contexts] is at:
> http://www.rebolforces.com/~ladislav/contexts.html
>
> P.P.S. How do you like the change in the UNBOUND? function?
>
>
> --
> 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