SICP 2.41

mapのネストは何回見ても混乱する。式が入れ子になることも混乱を助長している。シェルのパイプのように見えると、私にとってわかりやすいのだが。

(define (make-unique-triples n)
  (define (flatmap proc lis)
    (fold-right append '() (map proc lis)))
  
  (define (remove x lis)
    (filter (lambda (y) (not (= x y))) lis))

  (define (permutations s)
    (if (null? s)
        '(())
        (flatmap (lambda (x)
                   (map (lambda (p) (cons x p))
                        (permutations (remove x s))))
                 s)))
  
  (flatmap (lambda (i)
             (flatmap (lambda (j)
                        (flatmap (lambda (k) (permutations (list i j k)))
                                 (iota (- j 1) 1)))
                      (iota (- i 1) 1)))
           (iota n 1)))

(make-unique-triples 4)