[plt-scheme] It gets shared!

From: Jos Koot (jos.koot at telefonica.net)
Date: Tue Feb 17 06:18:16 EST 2009

unmark `Show sharing in values' in the `language/choose language' menu. You may have to open the `show details' first.
Jos
  ----- Original Message ----- 
  From: Andrei Estioco 
  To: plt-scheme at list.cs.brown.edu 
  Sent: Tuesday, February 17, 2009 1:30 AM
  Subject: [plt-scheme] It gets shared!


  Hello,

  I created a program which will display (in a list) a farey sequence of level n. My code is as follows:

  (define-struct farey (num denom))

  (define (farey-level n)
    (farey-acc (- n 1) (list (make-farey 0 1)
                             (make-farey 1 1))))

  (define (farey-acc n flist)
    (cond
      [(= n 0) flist]
      [else (farey-acc (- n 1) (insert-new-farey flist))]))

  (define (insert-new-farey flist)
    (append (get-first-two flist)
            (get-middle flist)
            (get-last-two flist)))

  (define (get-first-two flist)
    (list (first flist)
          (get-between flist)
          (second flist)))

  (define (get-middle flist)
    (local
      ((define (get-mid flist acc)
         (cond
           [(empty? flist) empty]
           [(= (length flist) 2) (reverse acc)]
           [else (get-mid (rest flist) (cons (first flist) acc))])))
      (get-mid (rest (rest flist))
               empty)))

  (define (get-last-two flist)
    (cond
      [(empty? (rest (rest flist))) (list (first flist)
                                          (get-between flist)
                                          (second flist))]
      [else (get-last-two (rest flist))]))

  (define (get-between flist)
    (make-farey (+ (farey-num (first flist))
                   (farey-num (second flist)))
                (+ (farey-denom (first flist))
                   (farey-denom (second flist)))))

  I test the code in Advanced Student. I call the function (farey-level 4) and get this result:

  > (shared ((-1- (make-farey 0 1)) (-9- (make-farey 1 1)))
    (list -1- (make-farey 1 4) (make-farey 1 3) (make-farey 1 2) -9- -1- (make-farey 1 2) (make-farey 2 3) (make-farey 3 4) -9-))

  This is not the result I was expecting so I run the code again, this time in Intermediate Student, with the same function call, (farey-level 4). This is the result I get:

  >(list
   (make-farey 0 1)
   (make-farey 1 4)
   (make-farey 1 3)
   (make-farey 1 2)
   (make-farey 1 1)
   (make-farey 0 1)
   (make-farey 1 2)
   (make-farey 2 3)
   (make-farey 3 4)
   (make-farey 1 1))

  Now that is the result I was expecting. My question is, why did it get (shared) in Advanced Student? I didn't even use (set!). The only instance I ever encountered (shared) was when I defined a doubly-linked list and, of course, I was expecting it then. Did I make a mistake in my code?

  -- 
  Chad Estioco
  BS Computer Science
  University of the Philippines-Diliman
  ==============================
  http://www.geocities.com/lokisky_walker



------------------------------------------------------------------------------


  _________________________________________________
    For list-related administrative tasks:
    http://list.cs.brown.edu/mailman/listinfo/plt-scheme
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20090217/617d78b0/attachment.html>

Posted on the users mailing list.