summaryrefslogtreecommitdiff
path: root/tools/tmisc.scm
diff options
context:
space:
mode:
Diffstat (limited to 'tools/tmisc.scm')
-rw-r--r--tools/tmisc.scm37
1 files changed, 36 insertions, 1 deletions
diff --git a/tools/tmisc.scm b/tools/tmisc.scm
index 107219e..7fe56d9 100644
--- a/tools/tmisc.scm
+++ b/tools/tmisc.scm
@@ -160,4 +160,39 @@
(mvtest)
-(exit)
+;;; unlet
+;;; incrementally set all globals to 42 -- check that unlet exprs return the same results
+
+(let* ((syms (symbol-table))
+ (num-syms (length syms))
+ (orig-x (*s7* 'print-length)))
+
+ (define (unlet-test i)
+ (with-let (unlet)
+ (catch #t
+ (lambda ()
+ (eval `(define ,(syms i) 42))
+ (when (procedure? (symbol->value (syms i) (rootlet)))
+ (with-let (unlet)
+ (eval `(set! ,(syms i) 42) (rootlet)))))
+ (lambda (type info)
+ ;(format *stderr* "~S unchanged: ~S~%" (syms i) (apply format #f info))
+ #f)))
+
+ (with-let (unlet)
+ (do ((k 0 (+ k 1)))
+ ((= k 1000))
+ (catch #t
+ (lambda ()
+ (let ((x (+ k (*s7* 'print-length))))
+ (unless (eqv? x (+ k orig-x))
+ (format *stderr* "sym: ~S, x: ~S, orig: ~S~%" (syms i) x (+ k orig-x)))))
+ (lambda (type info)
+ (format *stderr* "sym: ~S, error: ~S~%" (syms i) (apply format #f info)))))))
+
+ (do ((i 0 (#_+ i 1))) ; "do" is not a procedure (see above) so it's not in danger here
+ ((#_= i num-syms))
+ (unlet-test i)))
+
+
+(#_exit) ; we just clobbered exit above