プログラミング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)