* syncase.scm: fix bad let.
authorRob Browning <rlb@defaultvalue.org>
Tue, 12 Mar 2002 21:53:56 +0000 (21:53 +0000)
committerRob Browning <rlb@defaultvalue.org>
Tue, 12 Mar 2002 21:53:56 +0000 (21:53 +0000)
(gensym): fix failure on non-threaded

ice-9/syncase.scm

index dc8c321..1a2cc01 100644 (file)
 ;;
 (define gensym
   (let ((counter 0))
+
+    (define next-id
+      (if (provided? 'threads)
+          (let ((symlock (make-mutex)))
+            (lambda ()
+              (let ((result #f))
+                (with-mutex symlock
+                  (set! result counter)
+                  (set! counter (+ counter 1)))
+                result)))
+          ;; faster, non-threaded case.
+          (lambda ()
+            (let ((result counter))
+              (set! counter (+ counter 1))
+              result))))
+    
+    ;; actual gensym body code.
     (lambda (. rest)
-      (let ((val (number->string counter)))
-        (set! counter (+ counter 1))
-        (cond
-         ((null? rest)
-          (string->symbol (string-append "syntmp-" val)))
-         ((null? (cdr rest))
-          (string->symbol (string-append "syntmp-" (car rest) "-" val)))
-         (else
-          (error
-           "syncase's gensym called with the wrong number of arguments")))))))
+      (let* ((next-val (next-id))
+             (valstr (number->string next-val)))
+          (cond
+           ((null? rest)
+            (string->symbol (string-append "syntmp-" valstr)))
+           ((null? (cdr rest))
+            (string->symbol (string-append "syntmp-" (car rest) "-" valstr)))
+           (else
+            (error
+             (string-append
+              "syncase's gensym expected 0 or 1 arguments, got "
+              (length rest)))))))))
 
 ;;; Load the preprocessed code