さかもとのブログ

つらつらと

第7章練習問題

(define (tree-walk walker proc tree)
  (walker (lambda (elt)
            (if (list? #?=elt)
                (tree-walk walker proc elt)
                (proc elt)))
          tree))

(define (numbers-only-for-tree walker)
  (lambda (proc lis)
    (walker proc #?=(my-filter (lambda (x) (or (number? x) (pair? x))) lis))))

(tree-walk (numbers-only-for-tree map)
           (lambda (x) (* 2 x)) '(1 2 #f (3 4) #t 5 (6 (7 #t 8))))

とりあえず,filterでnumber?とpair?が真であるものを残す.

(1 2 (3 4) 5 (6 (7 #t 8)))

eltにlistの値が1つずつ入れられていき,elt = (3 4)のところでtree-walkの再帰が始まる.

#?=elt
#?-    (3 4)
#?="(stdin)":441:(my-filter (lambda (x) (or (number? x) (pair? x))) lis)
#?-    (3 4)
#?=elt
#?-    3
#?=elt
#?-    4

my-filter実行時にnumber?が真でないもの(内側のリストに#t, #fがあるもの)があっても,内側のlistに対するtree-walkの再帰で再びmy-filterがの走査が入るので,問題ない.

gosh> #?="(stdin)":441:(my-filter (lambda (x) (or (number? x) (pair? x))) lis)
#?-    (1 2 (3 4) 5 (6 (7 #t 8)))
#?=elt
#?-    1
#?=elt
#?-    2
#?=elt
#?-    (3 4)
#?="(stdin)":441:(my-filter (lambda (x) (or (number? x) (pair? x))) lis)
#?-    (3 4)
#?=elt
#?-    3
#?=elt
#?-    4
#?=elt
#?-    5
#?=elt
#?-    (6 (7 #t 8))
#?="(stdin)":441:(my-filter (lambda (x) (or (number? x) (pair? x))) lis)
#?-    (6 (7 #t 8))
#?=elt
#?-    6
#?=elt
#?-    (7 #t 8)
#?="(stdin)":441:(my-filter (lambda (x) (or (number? x) (pair? x))) lis)
#?-    (7 8)
#?=elt
#?-    7
#?=elt
#?-    8
(2 4 (6 8) 10 (12 (14 16)))