On Mar 1, 2014, at 5:50 AM, Jon Stenerson wrote: > When I put the following in the DrRacket definitions window and then evaluate > t, it works for a few seconds and runs out of memory. Anyone understand the > problem? > > #lang racket > > (define (Print stx port mode) > (if (Atom? stx) > (write-string "ATOM " port) > (Print (Pair-cdr stx) port mode))) > > (struct Base () > #:methods gen:custom-write > [(define write-proc Print)]) > > (struct Atom Base (datum)) > (struct Pair Base (car cdr)) > > (define t (struct-copy Base (Atom 3)))
t is _not_ an instance of Atom but Base, which is what the struct-copy expression specifies. When you enter > t Racket looks for a printer specification. It finds write-proc, which checks Atom? of stx and finds that t is not an Atom. Hence, it extracts Pair-cdr, but t is also not a Pair. Ergo, Pair-cdr raises an exception. The printer needs to print what it found in lieu of a Pair, so Racket looks for a printer specification. It finds write-proc, which ... Easiest fix: Change Base in the last line to Atom. -- Matthias ____________________ Racket Users list: http://lists.racket-lang.org/users