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


_______________________________________________
iterate-devel site list
iterate-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/iterate-devel

Reply via email to