[plt-scheme] Question about variable scope in lists

From: Zhu Chongkai (mathematica at citiz.net)
Date: Sat Feb 26 02:50:20 EST 2005

  
======= 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/




Posted on the users mailing list.