第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)))