src/utilities.lisp (categorize): Don't leak the ITEMS-VAR into the body.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 3 Aug 2019 14:01:14 +0000 (15:01 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 3 Aug 2019 15:46:21 +0000 (16:46 +0100)
The body forms only need the CAT-VARs, so that's all that should be
bound in their environment.

src/utilities.lisp

index 4935f8b..769ff5d 100644 (file)
                                                   (symbol-name name) "-")))
                           cat-names))
         (items-var (gensym "ITEMS-")))
-    `(let ((,items-var ,items)
-          ,@(mapcar (lambda (cat-var) (list cat-var nil)) cat-vars))
-       (dolist (,itemvar ,items-var)
-        (let* ,bind
-          (cond ,@(mapcar (lambda (cat-match-form cat-var)
-                            `(,cat-match-form
-                              (push ,itemvar ,cat-var)))
-                          cat-match-forms cat-vars)
-                ,@(and (not (member t cat-match-forms))
-                       `((t (error "Failed to categorize ~A" ,itemvar)))))))
+    `(let (,@(mapcar (lambda (cat-var) (list cat-var nil)) cat-vars))
+       (let ((,items-var ,items))
+        (dolist (,itemvar ,items-var)
+          (let* ,bind
+            (cond ,@(mapcar (lambda (cat-match-form cat-var)
+                              `(,cat-match-form
+                                (push ,itemvar ,cat-var)))
+                            cat-match-forms cat-vars)
+                  ,@(and (not (member t cat-match-forms))
+                         `((t (error "Failed to categorize ~A"
+                                     ,itemvar))))))))
        (let ,(mapcar (lambda (name var)
                       `(,name (nreverse ,var)))
                     cat-names cat-vars)