[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.lisp

Re: Most impressive examples of the LOOP macro

William James

9/2/2015 12:02:00 AM

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))
>
> (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) `(1 ,@(map + row (cdr row)) 1))
(i 0 (+ 1 i)))
((= i 16))
(print 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)
(1 12 66 220 495 792 924 792 495 220 66 12 1)
(1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1)
(1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1)
(1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1)

--
I think that we have to remember that the real activists who are doing this are
motivated not by love for humanity, not by love for America or anything else;
they are motivated by hatred for the traditional people and culture of America.
They are motivated by hatred toward the traditional people and culture of the
European countries. --- www.redicecreations.com/radio/2014/09/RIR-140929.php
2 Answers

William James

9/2/2015 6:05:00 PM

0

WJ wrote:

> 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))
> >
> > (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) `(1 ,@(map + row (cdr row)) 1))
> (i 0 (+ 1 i)))
> ((= i 16))
> (print 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)
> (1 12 66 220 495 792 924 792 495 220 66 12 1)
> (1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1)
> (1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1)
> (1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1)

MatzLisp (Ruby):

row=[1];16.times{p row;row=[0,*row].zip(row+[0]).map{|a,b|a+b}}

William James

3/30/2016 10:58:00 PM

0

WJ wrote:

> 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))
> >
> > (loop repeat 16 for list = '(1)
> > then (maplist #'(lambda (cons) (apply #'+ (ldiff cons (cddr cons)))) (cons
> > 0 list))
> > do (format t "~{~6D~^,~}~%" list))

OCaml:

open Printf;;
open List ;;

let p x = iter (printf "%5d") x; printf "\n" ;;


let rec g = function
a::b::r -> a+b :: g (b::r)
| x -> x ;;

let rec f = function
_::15::_ -> []
| xs -> p xs ; f (g (0::xs)) ;;

f [1];;

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
1 12 66 220 495 792 924 792 495 220 66 12 1
1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1

--
This is war, and our greatest enemy is the enemy within: the submissive,
apologetic, guilt-ridden, self-hating drone. The moment we manage to destroy
the enemy within, destroying the rest of our enemies will be a walk in the
park. http://www.kolumbus.fi/aquilon/londonsp...