Hi,
I was trying to roll an iterate driver for iterating over dates and I am stuck with a problem. When using defmacro-driver, I am unable to get the value passed in from to and other sequence classes. I tried with the example given in the manual (chapter "Rolling your own"), but hit the same problem. The manual says: "We can now refer to parameters from, to, by, etc. which contain either the values for the corresponding keyword, or nil if the keyword was not supplied. Implementing the right code for these keywords is cumbersome but not difficult; it is left as an exercise."
But I guess I am one of the dumb few who failed the exercise :)) The following is my attempt with the example given in the manual:
(defmacro-driver (FOR var IN-WHOLE-VECTOR v &sequence) "All the elements of a vector (disregards fill-pointer)" (let ((vect (gensym)) (end (gensym)) (index (gensym)) (myfrm (gensym "myfrm")) (kwd (if generate 'generate 'for))) `(progn (with ,vect = ,v) (with ,myfrm = ,from) (with ,end = (array-dimension ,vect 0)) (with ,index = -1) (,kwd ,var next (progn (incf ,index) (if (>= ,index ,end) (terminate)) (format t "myfrm: ~a~%" ,myfrm) (aref ,vect ,index))))))
I tried using the driver with: (a is an array of 10 elements) (iter (for v in-whole-vector a from 5 below 8) (print v))
I get the following error: The variable FROM is unbound. [Condition of type UNBOUND-VARIABLE]
Restarts: 0: [RETRY] Retry SLIME REPL evaluation request. 1: [*ABORT] Return to SLIME's top level. 2: [ABORT] Exit debugger, returning to top level.
Backtrace: 0: ((DEFMACRO CLAUSE-FOR-IN-WHOLE-VECTOR-18) (CLAUSE-FOR-IN-WHOLE-VECTOR-18 :FOR V :IN-WHOLE-VECTOR A :FROM ...) #<unused argument>) 1: (MACROEXPAND-1 (CLAUSE-FOR-IN-WHOLE-VECTOR-18 :FOR V :IN-WHOLE-VECTOR A :FROM ...) #<NULL-LEXENV>) 2: (ITERATE::PROCESS-CLAUSE (FOR V IN-WHOLE-VECTOR A FROM 5 ...)) 3: (ITERATE::WALK (FOR V IN-WHOLE-VECTOR A FROM 5 ...)) 4: (ITERATE::WALK-LIST-NCONCING ((FOR V IN-WHOLE-VECTOR A FROM 5 ...) (PRINT V)) #<FUNCTION ITERATE::WALK> #<FUNCTION (LAMBDA #) {100407D489}>) 5: (ITERATE::WALK-LIST ((FOR V IN-WHOLE-VECTOR A FROM 5 ...) (PRINT V))) 6: ((DEFMACRO ITER) ..)
I am using ubuntu maverick, 10.10, SBCL 1.0.45 64 bit.
I tried the following: (with ,myfrm = from)
I get an error: The variable FROM is unbound. [Condition of type UNBOUND-VARIABLE]
Restarts: 0: [RETRY] Retry SLIME REPL evaluation request. 1: [*ABORT] Return to SLIME's top level. 2: [ABORT] Exit debugger, returning to top level.
Backtrace: 0: ((LAMBDA ())) 1: (SB-INT:SIMPLE-EVAL-IN-LEXENV ..) 2: (SWANK::EVAL-REGION "(iter (for v in-whole-vector a from 5 below 8)\n (print v))\n") 3: ((LAMBDA ()))
2) (with ,myfrm = :from) This does not throw any error, but just prints myfrm: FROM instead of the value given
I want to use defclause-driver with the sequence keywords, I could not figure out how to get the values passed in from, to and other such clauses. Can anyone please provide some pointers?
Sorry, I meant defmacro-driver everywhere I mentioned defclause-driver in the last mail :(
On Sun, Jan 23, 2011 at 7:14 PM, Venkatesan S svtesan@gmail.com wrote:
Hi,
I was trying to roll an iterate driver for iterating over dates and I am stuck with a problem. When using defmacro-driver, I am unable to get the value passed in from to and other sequence classes. I tried with the example given in the manual (chapter "Rolling your own"), but hit the same problem. The manual says: "We can now refer to parameters from, to, by, etc. which contain either the values for the corresponding keyword, or nil if the keyword was not supplied. Implementing the right code for these keywords is cumbersome but not difficult; it is left as an exercise."
But I guess I am one of the dumb few who failed the exercise :)) The following is my attempt with the example given in the manual:
(defmacro-driver (FOR var IN-WHOLE-VECTOR v &sequence) "All the elements of a vector (disregards fill-pointer)" (let ((vect (gensym)) (end (gensym)) (index (gensym)) (myfrm (gensym "myfrm")) (kwd (if generate 'generate 'for))) `(progn (with ,vect = ,v) (with ,myfrm = ,from) (with ,end = (array-dimension ,vect 0)) (with ,index = -1) (,kwd ,var next (progn (incf ,index) (if (>= ,index ,end) (terminate)) (format t "myfrm: ~a~%" ,myfrm) (aref ,vect ,index))))))
I tried using the driver with: (a is an array of 10 elements) (iter (for v in-whole-vector a from 5 below 8) (print v))
I get the following error: The variable FROM is unbound. [Condition of type UNBOUND-VARIABLE]
Restarts: 0: [RETRY] Retry SLIME REPL evaluation request. 1: [*ABORT] Return to SLIME's top level. 2: [ABORT] Exit debugger, returning to top level.
Backtrace: 0: ((DEFMACRO CLAUSE-FOR-IN-WHOLE-VECTOR-18) (CLAUSE-FOR-IN-WHOLE-VECTOR-18 :FOR V :IN-WHOLE-VECTOR A :FROM ...) #<unused argument>) 1: (MACROEXPAND-1 (CLAUSE-FOR-IN-WHOLE-VECTOR-18 :FOR V :IN-WHOLE-VECTOR A :FROM ...) #<NULL-LEXENV>) 2: (ITERATE::PROCESS-CLAUSE (FOR V IN-WHOLE-VECTOR A FROM 5 ...)) 3: (ITERATE::WALK (FOR V IN-WHOLE-VECTOR A FROM 5 ...)) 4: (ITERATE::WALK-LIST-NCONCING ((FOR V IN-WHOLE-VECTOR A FROM 5 ...) (PRINT V)) #<FUNCTION ITERATE::WALK> #<FUNCTION (LAMBDA #) {100407D489}>) 5: (ITERATE::WALK-LIST ((FOR V IN-WHOLE-VECTOR A FROM 5 ...) (PRINT V))) 6: ((DEFMACRO ITER) ..)
I am using ubuntu maverick, 10.10, SBCL 1.0.45 64 bit.
I tried the following: (with ,myfrm = from)
I get an error: The variable FROM is unbound. [Condition of type UNBOUND-VARIABLE]
Restarts: 0: [RETRY] Retry SLIME REPL evaluation request. 1: [*ABORT] Return to SLIME's top level. 2: [ABORT] Exit debugger, returning to top level.
Backtrace: 0: ((LAMBDA ())) 1: (SB-INT:SIMPLE-EVAL-IN-LEXENV ..) 2: (SWANK::EVAL-REGION "(iter (for v in-whole-vector a from 5 below 8)\n (print v))\n") 3: ((LAMBDA ()))
- (with ,myfrm = :from)
This does not throw any error, but just prints myfrm: FROM instead of the value given
I want to use defclause-driver with the sequence keywords, I could not figure out how to get the values passed in from, to and other such clauses. Can anyone please provide some pointers?
-- Audentis fortuna juvat
Venkatesan S svtesan@gmail.com writes:
I want to use defclause-driver with the sequence keywords, I could not figure out how to get the values passed in from, to and other such clauses. Can anyone please provide some pointers?
Hi, you were just a tiny step from the working solution: With
(with ,myfrm = ,iterate::from)
, that is, using the qualified FROM from the iterate package, it works just fine. You can also see this, if you macroexpand your IN-WHOLE-VECTOR definition:
(EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (DEFMACRO CLAUSE-FOR-IN-WHOLE-VECTOR-5 (&KEY ((:FOR VAR)) ((:IN-WHOLE-VECTOR V)) ((:FROM ITERATE::FROM)) ((:UPFROM ITERATE::UPFROM)) ((:DOWNFROM ITERATE::DOWNFROM)) ((:TO ITERATE::TO)) ((:DOWNTO ITERATE::DOWNTO)) ((:ABOVE ITERATE::ABOVE)) ((:BELOW ITERATE::BELOW)) ((:BY ITERATE::BY) 1) ((:WITH-INDEX ITERATE::WITH-INDEX)) GENERATE) "All the elements of a vector (disregards fill-pointer)" ...
Since all those extra symbols are not exported from the iterate package, you've got to use them explicitely.
Hth and cheers, Olof
Thanks!! It works fine <sheepish grin>
On Mon, Jan 24, 2011 at 12:40 AM, Olof-Joachim Frahm Olof.Frahm@web.dewrote:
Venkatesan S svtesan@gmail.com writes:
I want to use defclause-driver with the sequence keywords, I could not figure out how to get the values passed in from, to and other such clauses. Can anyone please provide some pointers?
Hi, you were just a tiny step from the working solution: With
(with ,myfrm = ,iterate::from)
, that is, using the qualified FROM from the iterate package, it works just fine. You can also see this, if you macroexpand your IN-WHOLE-VECTOR definition:
(EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) (DEFMACRO CLAUSE-FOR-IN-WHOLE-VECTOR-5 (&KEY ((:FOR VAR)) ((:IN-WHOLE-VECTOR V)) ((:FROM
ITERATE::FROM))
((:UPFROM ITERATE::UPFROM)) ((:DOWNFROM ITERATE::DOWNFROM)) ((:TO ITERATE::TO)) ((:DOWNTO ITERATE::DOWNTO)) ((:ABOVE ITERATE::ABOVE)) ((:BELOW ITERATE::BELOW)) ((:BY ITERATE::BY) 1) ((:WITH-INDEX ITERATE::WITH-INDEX)) GENERATE) "All the elements of a vector (disregards fill-pointer)"
...
Since all those extra symbols are not exported from the iterate package, you've got to use them explicitely.
Hth and cheers, Olof
-- The world is burning. Run.
iterate-devel site list iterate-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/iterate-devel