そろそろ再開したいので、すこし復習してみた

リスト操作

(define (accumulate op init seq)
  (if (null? seq)
      init
      (op (car seq) (accumulate op init (cdr seq)))))
(define (enumerate-improver low high)
  (if (> low high)
      '()
      (cons low (enumerate-improver (+ low 1) high))))
;	gosh> (accumulate * 1 (enumerate-improver 1 10))
;	3628800
;	gosh> (accumulate + 0 (enumerate-improver 1 10))
;	55

(define (filter ok? seq)
  (cond ((null? seq)'())
        ((ok? (car seq)) (cons (car seq) (filter ok? (cdr seq))))
        (else
          (filter ok? (cdr seq)))))
(define (accumulate-n op init seq)
  (if (null? (car seq))
      '()
      (cons (accumulate op init (map car seq))
            (accumulate-n op init (map cdr seq)))))
;	gosh> (accumulate-n + 0 '((1 2 3) (10 20 30)))
;	(11 22 33)
;	gosh> (filter odd? (accumulate-n + 0 '((1 2 3) (10 20 30))))
;	(11 33)

(define (fringe tree)
  (cond ((null? tree) '())
        ((not (pair? tree)) (list tree))
        (else (append (fringe (car tree)) (fringe (cdr tree))))))
(define (recursive-reverse seq)
  (if (null? seq)
      '()
      (append (recursive-reverse (cdr seq)) (list (car seq)))))
;	gosh> (recursive-reverse (fringe '(((1 2) 3) 4 5 (6 (7 8)))))
;	(8 7 6 5 4 3 2 1)

(define (deep-reverse tree)
  (if (not (pair? tree))
      tree
      (cons (deep-reverse (cadr tree)) (list (deep-reverse (car tree))))))
;	gosh> (deep-reverse '((1 (2 3)) ((4 5) 6)))
;	((6 (5 4)) ((3 2) 1))