; pascal's triangle
(define (string-join sep ss)
(define (f s ss)
(string-append s (string sep) ss))
(define (join ss)
(if (null? (cdr ss)) (car ss)
(f (car ss) (join (cdr ss)))))
(if (null? ss) "" (join ss)))
(define (sums xs)
(let loop ((xs xs) (zs (list)))
(if (null? (cdr xs))
(reverse zs)
(loop (cdr xs)
(cons (+ (car xs) (cadr xs)) zs)))))
(define (pascal n)
(let loop ((n n) (tri (list (list 1))))
(if (zero? n)
(reverse tri)
(loop (- n 1)
(cons (append (list 1)
(sums (car tri))
(list 1))
tri)))))
(define (display-pascal width tri)
(let loop ((tri tri))
(when (pair? tri)
(let* ((str (string-join #\space (map number->string (car tri))))
(len (string-length str)))
(display (make-string (quotient (- width len) 2) #\space))
(display str)
(newline))
(loop (cdr tri)))))
(display-pascal 35 (pascal 10))