[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
SRFI 9's default printer doesn't handle cyclic data structures
From: |
Chris K. Jester-Young |
Subject: |
SRFI 9's default printer doesn't handle cyclic data structures |
Date: |
Mon, 25 Jul 2011 23:33:59 -0400 |
User-agent: |
Mutt/1.5.20 (2009-06-14) |
[Crossposted from bug-guile@ since my message isn't posting there. :-(]
Hi there,
I've been playing around with Guile's implementation of SRFI 45 (which
uses SRFI 9), and have noticed something interesting: if you run the
following code in the REPL, printing out the value of the promise will
cause a stack overflow:
(use-modules (srfi srfi-45))
(define promise (delay promise))
(force promise)
#<promise val: module/ice-9/format.scm:38:0: In procedure format:
module/ice-9/format.scm:38:0: Throw to key `vm-error' with args `(vm-run
"VM: Stack overflow" ())'.
However, if I change the SRFI 45 code to use Guile's native records,
it prints correctly:
#<promise val: #<value tag: eager proc: #-1#>>
For reproducibility, I attached the diff to make SRFI 45 use Guile
native records.
So, it seems like SRFI 9's record printer doesn't handle cycles in the
record data very well. Unfortunately I don't know how to fix this (I
tried looking at the printer for Guile's native records, but couldn't
figure out what made it special enough to handle cycles correctly), so
no fix is attached.
Many thanks,
Chris.
--- module/srfi/srfi-45.scm 2011-02-08 22:38:34.000000000 -0500
+++ module/srfi/srfi-45.scm 2011-07-23 20:24:51.000000000 -0400
@@ -37,15 +37,21 @@
lazy
force
eager)
- #:replace (delay force)
- #:use-module (srfi srfi-9))
+ #:replace (delay force))
-(define-record-type promise (make-promise val) promise?
- (val promise-val promise-val-set!))
+(define <promise> (make-record-type "promise" '(val)))
+(define make-promise (record-constructor <promise>))
+(define promise? (record-predicate <promise>))
+(define promise-val (record-accessor <promise> 'val))
+(define promise-val-set! (record-modifier <promise> 'val))
-(define-record-type value (make-value tag proc) value?
- (tag value-tag value-tag-set!)
- (proc value-proc value-proc-set!))
+(define <value> (make-record-type "value" '(tag proc)))
+(define make-value (record-constructor <value>))
+(define value? (record-predicate <value>))
+(define value-tag (record-accessor <value> 'tag))
+(define value-tag-set! (record-modifier <value> 'tag))
+(define value-proc (record-accessor <value> 'proc))
+(define value-proc-set! (record-modifier <value> 'proc))
(define-syntax lazy
(syntax-rules ()
- SRFI 9's default printer doesn't handle cyclic data structures,
Chris K. Jester-Young <=