Arc Forumnew | comments | leaders | submitlogin
Bug or lisp gotcha?
2 points by akkartik 5378 days ago | 3 comments

    (def foo(s) (let a '(3) (= (car a) (cons s (car a)))))

    arc> (foo 3)
    (3 . 3)
    arc> (foo 3)
    (3 3 . 3)
This looks vaguely familiar from common lisp, but I can't get it to happen in mzscheme. Is it a bug or just a gotcha we have to learn to live with?


4 points by fallintothis 5378 days ago | link

Tends to be a Lisp gotcha with quoted things, which act more like pointers than explicit copies.

  $ mzscheme
  Welcome to MzScheme version 360, Copyright (c) 2004-2006 PLT Scheme Inc.
  > (define (foo s)
      (let ((a '(3)))
        (set-car! a (cons s (car a)))
        (car a)))
  > (foo 3)
  (3 . 3)
  > (foo 3)
  (3 3 . 3)
Note that

  arc> (def foo (s) (let a (list 3) (= (car a) (cons s (car a)))))
  #<procedure: foo>
  arc> (foo 3)
  (3 . 3)
  arc> (foo 3)
  (3 . 3)
since list copies data.

-----

1 point by akkartik 5377 days ago | link

Ok, makes sense. Thanks!

-----

4 points by pg 5377 days ago | link

Actually this behavior can be quite useful in some contexts. It took some effort to make it possible.

-----