そろそろ再開したいので、すこし復習してみた
リスト操作
(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))