From Newsgroup: comp.lang.lisp
Re: Most impressive examples of the LOOP macro
Peter Seibel wrote:
; Prints the first 16 rows of Pascal's triangle
; not tested, I'm writing it from memory right here!
(loop repeat 16
for list = '(1) then (mapcar #'+ (cons 0 list) (append list
'(0)))
do (format t "~{~6D~^,~}~%" list))
That's definitely one of the most beautiful pieces of code I've ever written. I wrote it for a programming language comparison contest,
and blew every other language out of the water, except Mathematica,
of course. ;-)
Hmmm. I'm not sure any code that repeatedly APPENDs to the end of a
growing list can be all that elegant. If you're into this sort of
thin, both the versions below, while slightly longer in terms of
number of characters than yours, are, I'd argue, algorithmically more elegant:
(loop repeat 16 for list = '(1)
then (maplist #'(lambda (cons) (+ (car cons) (or (cadr cons) 0))) (cons 0 l
ist))
do (format t "~{~6D~^,~}~%" list))
He uses
#'(lambda
instead of
(lambda
(loop repeat 16 for list = '(1)
then (maplist #'(lambda (cons) (apply #'+ (ldiff cons (cddr cons)))) (cons
0 list))
do (format t "~{~6D~^,~}~%" list))
Gauche Scheme
(do ((row '(1) (map + `(0 ,@row) `(,@row 0))))
((> (length row) 16))
(print (string-join (map (pa$ format #f "~5@a") row) ",")))
1
1, 1
1, 2, 1
1, 3, 3, 1
1, 4, 6, 4, 1
1, 5, 10, 10, 5, 1
1, 6, 15, 20, 15, 6, 1
1, 7, 21, 35, 35, 21, 7, 1
1, 8, 28, 56, 70, 56, 28, 8, 1
1, 9, 36, 84, 126, 126, 84, 36, 9, 1
1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1
1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1
Etc.
--- Synchronet 3.21d-Linux NewsLink 1.2