練習問題 P.69 numbers-only-for-tree

(numbers-only for-each)や(numbers-only map)で入れ子のリストを処理できるか?
→ できない


理由: 例えば入れ子のリストの '(1 2 3 (4 5) 6) の
    4番目の要素 '(4 5) は数値ではなく、リストであるから


walker が満たすべき条件: 入れ子のリストの中も処理すること


とりあえず入れ子のリストにも対応させた filter-for-tree を定義した。

(define (filter-for-tree pred lis)
  (cond ((null? lis) lis)
        ((pair? (car lis)) (cons (filter-for-tree pred (car lis)) (filter-for-tree pred (cdr lis))))
        ((pred (car lis)) (cons (car lis) (filter-for-tree pred (cdr lis))))
        (else (filter-for-tree pred (cdr lis)))))

(define (numbers-only-for-tree walker)
  (lambda (proc lis)
    (walker proc (filter-for-tree number? lis))))