[plt-scheme] Question about variable scope in lists
======= At 2005-02-26, 13:33:05 A00453721 wrote: =======
>
>Greetings. First of all, I would like to clarify that, while I am a CS student,
>I'm not explicitly asking for help on my assignment. I would just like an
>explanation of why is this happening:
>
>Currently, I'm investigating the effects of destructive modifications on
>variables passed to procedures using Dr. Scheme.
>
>While reading the "Teach yourself Scheme in fixnum days" study book, I found
>this destructive code which reverses a list "in-place".
>
>(define reverse!
> (lambda (s)
> (let loop ((s s) (r '()))
> (if (null? s) r
> (let ((d (cdr s)))
> (set-cdr! s r)
> (loop d s))))))
>
>However, I tried it in the interactions windows like this:
>
>( define U '( 1 2 3 4 5 6 7 8 ) )
>( reverse! U )
>
>Not to my surprise, the output was:
>
>(8 7 6 5 4 3 2 1)
>
>but when I asked the interpreter to reevaluate U, it just displayed:
>
>(1)
>
>Similarly, I studied a predicate removal function from GUILE Scheme, defined
>like this:
>
>CODE
>(define (delete-if! pred l)
> "Destructive version of `remove-if'."
> (let delete-if ((l l))
> (cond ((null? l) '())
> ((pred (car l)) (delete-if (cdr l)))
> (else
> (set-cdr! l (delete-if (cdr l)))
> l))))
>
>And again, when I tested it in the interactions window like this...
>
>( define R '( #f #t #t #f #f #t ) )
>( delete-if! not R )
>
>The output was:
>
>(#t #t #t)
>
>but when I reevaluated R, I got:
>
>(#f #t #t #t)
>
>Aren't these destructive functions supposed to have modified the contents
>of both U and R?
>
Yes, exactly.
'reverse!' is the standard function that does "in-place" reverse. The
reversed list is composed with the same element as in 'U'. So after the
reversing, 'U' is destructed. The same about 'delete-if!'.
>Or is there anything I'm getting wrong about variable scopes? I ask this
>mainly because I'm having problems with an "in-place" sorting algorithm I
>was asked to develop. I would appreciate any kind of help.
>
>Thanks.
= = = = = = = = = = = = = = = = = = = =
Zhu Chongkai
http://www.neilvandyke.org/mrmathematica/