Fix definition of list? to terminate even in the presence of circular
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Wed, 14 Feb 1990 00:20:38 +0000 (00:20 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Wed, 14 Feb 1990 00:20:38 +0000 (00:20 +0000)
structure, as required by the standard.

v7/src/runtime/list.scm

index 292cdd13b503c596f63765d63316032568231d18..753ea8a480ef7a2582ada65ccefeff1fda6de55c 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/list.scm,v 14.10 1989/10/26 06:46:31 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/list.scm,v 14.11 1990/02/14 00:20:38 jinx Exp $
 
 Copyright (c) 1988, 1989 Massachusetts Institute of Technology
 
@@ -113,12 +113,38 @@ MIT in each case. |#
 (define (sublist list start end)
   (list-head (list-tail list start) (- end start)))
 \f
+#|
+;; This version does not detect circularity
+
 (define (list? object)
   (let loop ((object object))
     (if (null? object)
        true
        (and (pair? object)
             (loop (cdr object))))))
+|#
+
+(define (list? obj)
+  (define (phase-1 l1 l2)
+    (cond ((pair? l1)
+          (phase-2 (cdr l1) l2))
+         ((null? l1)
+          true)
+         (else
+          false)))
+
+  (define (phase-2 l1 l2)
+    (cond ((eq? l1 l2)
+          ;; Circular list.
+          false)
+         ((pair? l1)
+          (phase-1 (cdr l1) (cdr l2)))
+         ((null? l1)
+          true)
+         (else
+          false)))
+
+  (phase-1 obj obj))
 
 (define (alist? object)
   (if (null? object)