Download code

Jump to: navigation, search

Back to List_comprehension_(Lisp)

Download for Windows: single file, zip

Download for UNIX: single file, zip, tar.gz, tar.bz2

comprehension.lisp

 1 ; The authors of this work have released all rights to it and placed it
 2 ; in the public domain under the Creative Commons CC0 1.0 waiver
 3 ; (http://creativecommons.org/publicdomain/zero/1.0/).
 4 ; 
 5 ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 6 ; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 7 ; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 8 ; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 9 ; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
10 ; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
11 ; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12 ; 
13 ; Retrieved from: http://en.literateprograms.org/List_comprehension_(Lisp)?oldid=7599
14 
15 
16 (defun make-loops (var-list-pairs last-loop-body)
17   (if (endp var-list-pairs)
18     last-loop-body
19     (destructuring-bind ((var list) . therest) var-list-pairs
20       `(loop for ,var in ,list do ,(make-loops therest last-loop-body)))))
21 
22 (defmacro make-comprehension (expr vars-in-lists guards)
23   (let ((accum (gensym)))
24     `(let ((,accum (list)))
25        (progn 
26 	 ,(make-loops vars-in-lists
27 		      `(if (and ,@guards)
28 			 (push ,expr ,accum)))
29 	 (nreverse ,accum)))))


hijacker
hijacker
hijacker
hijacker