[iterate-devel] defclause-driver with &sequence
Venkatesan S
svtesan at gmail.com
Sun Jan 23 11:22:25 UTC 2011
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 at 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 ()))
>
>
> 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?
>
>
>
> --
> Audentis fortuna juvat
>
--
Audentis fortuna juvat
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/iterate-devel/attachments/20110123/c4a4f4d2/attachment.html>
More information about the iterate-devel
mailing list