[CM] Forwarded: [ITERATE: old software, ported to the 21st century]

rm@fabula.de rm@fabula.de
Wed, 17 Dec 2003 18:26:44 +0100

I guess quite a few of use iterate over stuff once in a while :-)
I thought following post to the CLUMP list might be of interest to you.
I think someone allready works on a Debian package as well.
 Ralf Mattes

----- Forwarded message from Andreas Fuchs <asf@boinkor.net> -----

X-Original-To: clump@manly.caddr.com
X-Injected-Via-Gmane: http://gmane.org/
To: clump@manly.caddr.com
From: Andreas Fuchs <asf@boinkor.net>
Subject: [Clump] ITERATE: old software, ported to the 21st century

hi all,

For fun, I ported the ITERATE macro package from the CMU AI repository
over to ANSI Common Lisp. In short, the ITERATE macro is an
extensible, more flexible and more lispy replacement for LOOP.

Some example code:

(iterate (for (key . item) in alist)
	 (collect key into keys)
	 (collect item into items)
	 (finally (return (values keys items))))

collects keys and items of an alist into two values

It also supports generators:

(iterate (generate i from 0 to 6)
	 (for (key . value) in '((a . 2) (zero . 10) (one . 20) (d . 5)))
	 (when (>= value 10)
	   (collect (cons key (next i)))))

	  => ((B . 0) (C . 1))

(note also the liberal mixing of code and iterate clauses)

and allows easy finding of extrema:

(iterate (for elt in list-of-lists)
	 (finding elt maximizing (length elt)))

finds the longest list in a list of lists and generates pretty fast
code, too. (-:

There are more examples in the reference documentation in
doc/iter-man.ps, and a nice rant about LOOP (and more examples) in
doc/iterate-bare.ps (-:

You can find the code at
http://boinkor.net/lisp/iterate-ansi-0.9.1.tgz (MIT-licensed), and it
is ASDF-installable: (asdf-install:install 'iterate)

The original code was written by Jonathan Amsterdam. Kudos to him!
Andreas Fuchs, <asf@boinkor.net>, asf@jabber.at, antifuchs

Clump mailing list

----- End forwarded message -----