プログラミングGauche p.65あたり
関数を引数に取る関数(for-eachやmap)を引数に取る関数(tree-walk)を作り、for-eachやmapの代わりにlambdaで新しくtreewalkの方法を書くとかの例を勉強した
tree-walk.scm
#!/usr/bin/env gosh (print "p.65 tree-walk") ;; listの中身がlistだったら再帰的にprocを実行する (define (tree-walk walker proc tree) (walker (lambda (item) (if (list? item) (tree-walk walker proc item) (proc item))) tree)) (tree-walk for-each print '(1 2 3)) (print "-----") (define tree '(1 2 (3 4 (5 6) 7) 8 9)) (tree-walk for-each print tree) (print "-----reverse") (tree-walk (lambda (proc list) (for-each proc (reverse list))) print tree) (print "-----map") (print (map (lambda (x) (* x 2)) '(1 3 5))) (print "tree => "tree) (print "*2 => " (tree-walk map (lambda (x) (* x 2)) tree)) (print "*4 and reverse => " (tree-walk (lambda (proc list) (map proc (reverse list))) (lambda (x) (* x 4)) tree))
実行
p.65 tree-walk 1 2 3 ----- 1 2 3 4 5 6 7 8 9 -----reverse 9 8 7 6 5 4 3 2 1 -----map (2 6 10) tree => (1 2 (3 4 (5 6) 7) 8 9) *2 => (2 4 (6 8 (10 12) 14) 16 18) *4 and reverse => (36 32 (28 (24 20) 16 12) 8 4)