Hi, so I played with this a bit and attached a patch to fix it by moving
the wrapping with WRAP-FORM/LOOP-BODY-WRAPPERS one level down inside the
variable declarations. Two test cases are included (one for IN-HASHTABLE, the
other
for IN-PACKAGE, which shares the behaviour).
Since no other parts of the code need the current behaviour of WRAP-FORM
I just changed it instead of introducing another wrapper list like
LOOP-BODY-INNER-WRAPPERS or so ...
Cheers,
Olof
--
The world is burning. Run.
diff -rN -U3 old-iterate/iterate.lisp new-iterate/iterate.lisp
--- old-iterate/iterate.lisp 2010-08-16 03:13:09.000000000 +0200
+++ new-iterate/iterate.lisp 2010-08-16 03:13:09.000000000 +0200
@@ -582,14 +582,14 @@
,(if (member *result-var* *bindings* :key #'car)
*result-var*
nil))))
- (wrap-form *loop-body-wrappers*
- `(let* ,(nreverse *bindings*)
- ,.(if *declarations*
- `((declare .,*declarations*)))
- ,.decls
- ,(if final-prot
- `(unwind-protect ,it-bod .,final-prot)
- it-bod)))))))
+ `(let* ,(nreverse *bindings*)
+ ,.(if *declarations*
+ `((declare .,*declarations*)))
+ ,.decls
+ ,(if final-prot
+ `(unwind-protect ,it-bod .,final-prot)
+ (wrap-form *loop-body-wrappers*
+ it-bod)))))))
(defmacro defmacro-clause (clause-template &body body)
"Create your own iterate clauses"
diff -rN -U3 old-iterate/iterate-test.lisp new-iterate/iterate-test.lisp
--- old-iterate/iterate-test.lisp 2010-08-16 03:13:09.000000000 +0200
+++ new-iterate/iterate-test.lisp 2010-08-16 03:13:09.000000000 +0200
@@ -291,6 +291,15 @@
#'< :key #'car))
((1 . b) (6 . 3)))
+;; to test the behaviour of WITH versus WITH-HASH-TABLE-ITERATOR
+(deftest in-hashtable.immediate.1
+ (iter
+ (with table = (let ((ht (make-hash-table)))
+ (setup-hash-table ht)
+ ht))
+ (for (k) in-hashtable table))
+ nil)
+
(deftest in-package.internals
(let ((syms nil)
(iter-syms (iterate (for sym in-package *package* :external-only nil)
@@ -333,6 +342,13 @@
(set-difference iter-syms syms)))
(()()))
+;; to test the behaviour of WITH versus WITH-PACKAGE-ITERATOR
+(deftest in-package.immediate.1
+ (iter
+ (with package = (find-package '#:cl-user))
+ (for sym in-package package))
+ nil)
+
(deftest in-packages.external
(let ((syms nil)
(iter-syms (iterate (as (sym access package) in-packages '(#:cl-user)
_______________________________________________
iterate-devel site list
[email protected]
http://common-lisp.net/mailman/listinfo/iterate-devel