Return unspecific value for weak-pair side-effects. Write new
authorChris Hanson <org/chris-hanson/cph>
Fri, 21 Apr 1989 19:25:06 +0000 (19:25 +0000)
committerChris Hanson <org/chris-hanson/cph>
Fri, 21 Apr 1989 19:25:06 +0000 (19:25 +0000)
procedures `weak-list->list' and `list->weak-list'.

v7/src/runtime/list.scm

index 54f0661b5be23b295d949ad808dd8cc7a7e1cccc..31a1ab62ad4f64d73268f0c2dbf7fec0e7ab0918 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/list.scm,v 14.5 1989/03/07 01:21:30 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/list.scm,v 14.6 1989/04/21 19:25:06 cph Exp $
 
 Copyright (c) 1988, 1989 Massachusetts Institute of Technology
 
@@ -166,13 +166,15 @@ MIT in each case. |#
         car)))
 
 (define-integrable (weak-set-car! weak-pair object)
-  (system-pair-set-car! weak-pair (or object weak-pair/false)))
+  (system-pair-set-car! weak-pair (or object weak-pair/false))
+  unspecific)
 
 (define-integrable (weak-cdr weak-pair)
   (system-pair-cdr weak-pair))
 
 (define-integrable (weak-set-cdr! weak-pair object)
-  (system-pair-set-cdr! weak-pair object))
+  (system-pair-set-cdr! weak-pair object)
+  unspecific)
 
 (define (weak-memq object weak-list)
   (let ((object (if object object weak-pair/false)))
@@ -182,6 +184,26 @@ MIT in each case. |#
               weak-list
               (loop (system-pair-cdr weak-list)))))))
 
+(define (weak-list->list weak-list)
+  (if (weak-pair? weak-list)
+      (let ((car (system-pair-car weak-list)))
+       (if (not car)
+           (weak-list->list (system-pair-cdr weak-list))
+           (cons (if (eq? car weak-pair/false) false car)
+                 (weak-list->list (system-pair-cdr weak-list)))))
+      (begin
+       (if (not (null? weak-list))
+           (error "improperly terminated weak list" weak-list))
+       '())))
+
+(define (list->weak-list list)
+  (if (pair? list)
+      (weak-cons (car list) (list->weak-list (cdr list)))
+      (begin
+       (if (not (null? list))
+           (error "improperly terminated list" list))
+       '())))
+
 (define weak-pair/false
   "weak-pair/false")
 \f