[iterate-devel] Problem with DEFCLAUSE-DRIVER
Hi I am trying again to extend ENUMERATIONs with ITERATE. Here is my try ;;;; -*- Mode: Lisp -*- ;;;; iterate-enumeration.lisp -- ;;;; ITERATE extension for ENUMERATIONs. (in-package "ITERATE") (defclause-driver (FOR var OVER enum) (let ((e (gensym "ENUM-")) (kwd (if generate 'generate 'for)) ) `(progn (with ,e = ,enum) (,kwd ,var next (if (enum:has-more-elements-p ,e) (enum:next ,e) (terminate)))))) ;;;; end of file -- iterate-enumeration.lisp -- However I get this error when I try it. =========== CL-USER 31 > (iter (for x over (enum:range 3 8)) (collect (1+ x))) Error: Undefined operator WITH in form (WITH #:ENUM-7002 = (CL.EXTENSIONS.ENUMERATIONS:RANGE 3 8)). 1 (continue) Try invoking WITH again. 2 Return some values from the form (WITH #:ENUM-7002 = (CL.EXTENSIONS.ENUMERATIONS:RANGE 3 8)). 3 Try invoking something other than WITH with the same arguments. 4 Set the symbol-function of WITH to another function. 5 Set the macro-function of WITH to another function. 6 (abort) Return to level 0. 7 Return to top loop level 0. Type :b for backtrace, :c <option number> to proceed, or :? for other options =========== And I get the following, seemingly bogus macroexpansion. =========== CL-USER 38 > (pprint (macroexpand-1 '(iter (for x over (enum:range 3 8)) (collect (1+ x))))) (LET* ((#:RESULT57 NIL) (#:END-POINTER58 NIL) (#:TEMP59 NIL)) (BLOCK NIL (TAGBODY LOOP-TOP-NIL PROGN (WITH #:ENUM-7006 = (CL.EXTENSIONS.ENUMERATIONS:RANGE 3 8)) (FOR X NEXT (IF (CL.EXTENSIONS.ENUMERATIONS:HAS-MORE-ELEMENTS-P #:ENUM-7006) (CL.EXTENSIONS.ENUMERATIONS:NEXT #:ENUM-7006) (TERMINATE))) (PROGN (SETQ #:TEMP59 (LIST (1+ X))) (SETQ #:END-POINTER58 (IF #:RESULT57 (SETF (CDR #:END- POINTER58) #:TEMP59) (SETQ #:RESULT57 #:TEMP59))) #:RESULT57) (GO LOOP-TOP-NIL)) #:RESULT57)) =========== I feel there is a but either in the manual or in the code. Which is which? Cheers -- Marco Antoniotti
participants (1)
-
Marco Antoniotti