SICP問題2.28

fringeの定義

(define (fringe x)
  (define (iter rest result)
    (cond ((null? rest) result)
      ((pair? (car rest))
       (iter (cdr rest)
         (append 
          result (iter (car rest) (list)))))
      (else
       (iter (cdr rest) (append result (list (car rest)))))))
  (iter x (list)))

テスト

(define x (list (list 1 2) (list 3 4)))
; ((1 2) (3 4))
(fringe x)
; (1 2 3 4)
(fringe (list x x))
; (1 2 3 4 1 2 3 4)