[iterate-devel] date iterator extension to iterate
Venkatesan S
svtesan at gmail.com
Wed Jan 26 03:01:19 UTC 2011
> Well, using something other than a plain symbol after the FOR keyword
> isn't supported by DEFMACRO-DRIVER because that symbol is inserted in a
> normal macro definition. E.g.:
>
> yeah, I saw it in macroexpand and the macro flew into a rage if I tried to
use any other variable than the first in the next form (like: (,kwd ,mm ...
). I ascribed it to my lack of knowledge and never thought it was illegal
:)
> Well, contact the author? And although it may for you logically belong
> there, it adds a dependency to the date-calc package, which is, for a
> small library perhaps not worth it. Since iterate has contribs (or one,
> the postgres driver) I'd think it could be added there instead more
> easily. But I'm only using this library, so same goes here.
>
> I posted to date-calc-devel mailing list too, but as you say contribs might
be a better place for this. How do I go about putting this into
iterate/contribs?
Thanks for your time, and the inputs. I very much appreciate it.
Code remarks: I'd probably use &key instead of &optional, because
> wrapping date-calc:today every time I want to change skip-weekends would
> be too much work. Everything else is personal style, such as my habit
> for long names. And for just learning it looks good, imho.
>
> General remarks: use irc.freenode.net, #lisp and, if you like usenet,
> comp.lang.lisp, because there're certainly more people reading in those
> places. And you'll get more flames ;)
>
> Cheers,
> Olof
>
> [1]: http://www.lispworks.com/documentation/HyperSpec/Body/03_dd.htm
>
> --8<---------------cut here---------------start------------->8---
> (iterate::defclause-driver (FOR year-month-date-vars FROM-DATE
> from-date-spec &optional TO to-date-spec BY (n 1) SKIP-WEEKENDS (skipval t))
> "Driver for iterating over dates. All dates are in (YYYY MM DD) format."
> (declare (ignorable to-date-spec))
> (iterate::top-level-check)
> (unless (and (listp year-month-date-vars)
> (every #'symbolp year-month-date-vars))
> (iterate::clause-error "~a should be a list of up to three variables: ~
> the year, month and day" year-month-date-vars))
> (mapc #'iterate::make-default-binding year-month-date-vars)
> (let* ((step-var (iterate::make-var-and-default-binding 'by :type
> 'fixnum))
> (fy (iterate::make-var-and-default-binding 'from-year :type
> 'fixnum))
> (fm (iterate::make-var-and-default-binding 'from-month :type
> 'fixnum))
> (fd (iterate::make-var-and-default-binding 'from-day :type
> 'fixnum))
> (ty (iterate::make-var-and-default-binding 'to-year :type 'fixnum))
> (tm (iterate::make-var-and-default-binding 'to-month :type
> 'fixnum))
> (td (iterate::make-var-and-default-binding 'to-day :type 'fixnum))
> (step `((multiple-value-setq (,fy ,fm ,fd)
> (get-next-day ,fy ,fm ,fd ,step-var ,skipval))
> (multiple-value-setq ,year-month-date-vars
> (values ,fy ,fm ,fd))))
> (test `(when (< (date-calc:delta-days ,fy ,fm ,fd ,ty ,tm ,td) 0)
> (go ,iterate::*loop-end*))))
> (setf iterate::*loop-end-used?* T)
> (iterate::return-driver-code
> :initial `((setq ,step-var ,n)
> (destructuring-bind (y m d)
> ,from-date-spec
> (multiple-value-setq (,fy ,fm ,fd)
> (get-next-day y m d (- ,step-var) ,skipval)))
> (let ((spec ,to-date-spec))
> (multiple-value-setq (,ty ,tm ,td)
> (if spec
> (values-list spec)
> (date-calc:today)))))
> :next `(,.step ,test)
> :variable year-month-date-vars)))
> --8<---------------cut here---------------end--------------->8---
>
> --
> The world is burning. Run.
>
> _______________________________________________
> iterate-devel site list
> iterate-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/iterate-devel
--
Audentis fortuna juvat
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/iterate-devel/attachments/20110126/a9bc8060/attachment.html>
More information about the iterate-devel
mailing list