Hi Ladislav, Brett,
Ladislav wrote:
>> blk: copy []
>> probeblk: func [] [
>> prin mold blk
>> prin ": "
>> print mold reduce blk
>> ]
>> recfun: func [x] [
>> append blk 'x
>> either x <= 1 [
>> probeblk
>> ] [
>> recfun x - 1
>> ]
>> ]
>> recfun 3
>> probeblk
To which Brett replied
>I would have expected [3 2 1]
>not [1 1 1] nor [3 3 3].
What you are demonstrating, Ladislav, is IMHO a conflict that results from
the fact that REBOL is using two different binding mechanisms.
During recursive calls, REBOL is using a dynamic binding for 'x, which
means that each instance of recfunc, called from within recfunc
recursively, has its own context in which 'x is bound to the value that was
passed to the recfunc instance.
Once the recursion expires the context of 'x is again bound to the value it
last had before recfunc called itself recursively, it is bound in the
static context of the top-level instance of the recfunc function.
So 'x exists in multiple contexts: the static context of the function
recfunc, and the temporary dynamic contexts, that are created for each
recfunc instance, when recfunc calls itself recursively.
When you reduce blk from within a recursively called instance of recfunc,
'x is bound in the temporary dynamic context of the recursively called
function's instance. Once recfunc's loop expires and there are no more
recursively called instances of recfunc effective, then 'x is once again
bound in the context of the top-level recfunc function, its static context,
and the reduced block evaluates to the value that 'x is bound to in that
context.
At 11:44 PM 7/19/00 +1000, you wrote:
>I would have expected [3 2 1]
>not [1 1 1] nor [3 3 3].
>
>But I find it difficult to answer what I want, because the function argument
>x seems like it's in a bit of a no-mans land (I'm thinking of :x )
>
>My brain hurts now. :)
>Brett.
>
>----- Original Message -----
>From: <[EMAIL PROTECTED]>
>To: <[EMAIL PROTECTED]>
>Sent: Wednesday, July 19, 2000 5:03 PM
>Subject: [REBOL] Bug in 'use? Re:(3)
>
>
>> Hi,
>>
>> > Hi Ladislav, 15-Jul-2000 you wrote:
>> >
>> > >you are right, the problem is caused by a context
>> manipulation -
>> > >Use unsets your Middle every time it gets executed. My
>> suggestion
>> > >is to not use Use in recursive functions, while this problem
>> > >doesn't get corrected.
>> >
>> > Judging from the nature of recursiveness, that's a little hard,
>> isn't it? ;-)
>> >
>> > Do you know if this problem has already been reported to
>> feedback?
>> >
>> > Kind regards,
>> > --
>> > Ole Friis <[EMAIL PROTECTED]>
>> >
>> > Amiga is a trademark of Amiga Inc.
>> >
>>
>> You should probably report it to feedback. BTW, did you succeed to
>> sort the permutations correctly?
>>
>> One more question for everybody. What do you want to see after
>> executing:
>>
>> blk: copy []
>> probeblk: func [] [
>> prin mold blk
>> prin ": "
>> print mold reduce blk
>> ]
>> recfun: func [x] [
>> append blk 'x
>> either x <= 1 [
>> probeblk
>> ] [
>> recfun x - 1
>> ]
>> ]
>> recfun 3
>> probeblk
>>
>> Regards
>> Ladislav
>>
>
>
>
;- Elan [ : - ) ]