(Note I am talking about my 1common-lisp/0time-iterator.lisp) On the off chance that it is directly useful, I wrote 40 somewhat daunting lines of code that directly do roughly what I think C was describing. Aside from the program being useful, my thinking is to provide a counterpoint to most date programming online examples. Common lisp in particular and programming in general sometimes has unreliable commentary by non-lispers (sez me). I will try to be complete here (more than I think many people might need). I installed a lisp compiler, ecl, like this as root: ```openbsd pkg_add ecl ``` Or on some linuxes: ```gentoo emerge ecls ``` (I don't know why that s is there) ```debian apt-get install -y ecl ``` and download my lisp code, time-iterator.lisp. The code has several notes where number values might like to be changed. One way of running time-iterator.lisp is like this: ```ksh ecl --load time-iterator.lisp ``` $ ecl --load time-iterator.lisp ;;; Loading "/path/of/time-iterator.lisp" date:29 month:12 year:1969 date:1 month:1 year:1970 date:4 month:1 year:1970 date:28 month:1 year:1970 date:31 month:1 year:1970 date:3 month:2 year:1970 date:27 month:2 year:1970 date:2 month:3 year:1970 date:5 month:3 year:1970 date:29 month:3 year:1970 date:1 month:4 year:1970 date:4 month:4 year:1970 date:28 month:4 year:1970 date:1 month:5 year:1970 date:4 month:5 year:1970 $ ``` Portability: At the end of the program I use the ecl compiler's si:quit. In sbcl that would be sb-ext:quit. Mechanism: I (defvar variablename) some variables, or (defparameter parametername) when value will not be changeable. Then I (setq variablename new-value) inside a 'let. It's like this (but this is not useful/from the program) (defvar *foo*) (let ((a 3) (b 4)) (setq *foo* (* a b))) (princ *foo*) > 12 Let provides locally scoped variables. In lisp normally everything you write is a list like this: (function argument argument) So we know by position in the list that in (* a b) #'* is a function and a and b its arguments. Similarly, (setq *foo* (* a b)) Has the special function #'setq, with the arguements *foo* and (* a b). Innermost lists are evaluated first. The loop facility: I just used #'loop to do almost everything. Loops are kind of like this: > (loop for x from 1 to 10 by 2 do (princ x) do (terpri) finally (terpri)) 1 3 5 7 9 NIL > Any whitespace in lisp, including newlines is treated the same. (terpri) sends a newline to the terminal. Another way to do that loop would be: > (loop for x in (list 1 3 5 7 9) do (princ x) do (terpri) finally (terpri)) In general there can be lots of fors and lots of dos, and it's common to put additional loops inside a do. PS: A different view on time/date programming in lisp that is well known follows http://cl-cookbook.sourceforge.net/dates_and_times.html PPS: I forgot the most important part. C if you look into lisp, I would love to know more from Japan about Kyoto Common Lisp (the parent of ECL). The copy- right on the free software license starts at Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya which I guess is why ECL's > (describe 'get-decoded-time) includes an explanation that Japan's time zone is -9, and that the year is Christian and not long-live-Emperor.