• Re: Most impressive examples of the LOOP macro

    From B. Pym@Nobody447095@here-nor-there.org to comp.lang.lisp on Tue Jul 1 01:29:42 2025
    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