In Guile 1.4, (format "~A" (make-vector 500 0)) leads to a stack
overflow. The reason is a non-tail-recursive implementation of
format:obj->str in (ice-9 format). Here is a patch that fixes this.

--- /home/mkoeppe/s/guile-1.4/ice-9/format.scm~ Mon Jun 12 14:43:34 2000
+++ /home/mkoeppe/s/guile-1.4/ice-9/format.scm  Mon Aug 14 11:21:04 2000
@@ -822,13 +822,17 @@
          (string-append "("
                         (let loop ((obj-list obj)
                                    (visited visited)
-                                   (offset 0))
+                                   (offset 0)
+                                   (prefix ""))
                           (cond ((null? (cdr obj-list))
-                                 (obj->str (car obj-list)
-                                           #t
-                                           (cons (car obj-list) visited)))
+                                 (string-append
+                                  prefix
+                                  (obj->str (car obj-list)
+                                            #t
+                                            (cons (car obj-list) visited))))
                                 ((memq (cdr obj-list) visited)
                                  (string-append
+                                  prefix
                                   (obj->str (car obj-list)
                                             #t
                                             (cons (car obj-list) visited))
@@ -838,16 +842,18 @@
                                       (list-index visited (cdr obj-list))))
                                   "#"))
                                 ((pair? (cdr obj-list))
-                                 (string-append
-                                  (obj->str (car obj-list)
-                                            #t
-                                            (cons (car obj-list) visited))
-                                  " "
-                                  (loop (cdr obj-list)
-                                        (cons (cdr obj-list) visited)
-                                        (+ 1 offset))))
+                                 (loop (cdr obj-list)
+                                       (cons (cdr obj-list) visited)
+                                       (+ 1 offset)
+                                       (string-append
+                                        prefix
+                                        (obj->str (car obj-list)
+                                                  #t
+                                                  (cons (car obj-list) visited))
+                                        " ")))
                                 (else
                                  (string-append
+                                  prefix
                                   (obj->str (car obj-list)
                                             #t
                                             (cons (car obj-list) visited))

-- 
Matthias K�ppe -- http://www.math.uni-magdeburg.de/~mkoeppe

Reply via email to