2009/01/26

[scheme][Gauche]for-each, tree-walk, reverse-tree-walk

プログラミングGauche」P.64~ 66 7.2 手続きを取る手続き

ようは高階関数ということで。foldも高階関数ですね。

 

 

for-eachを試してみる。

(for-each (lambda (n) (print (* n n))) '(1 2 3 4 5))


;; => gosh> 1
;; => 4
;; => 9
;; => 16
;; => 25
;; => #<undef>

 

 

tree-walk写経。

;; tree-walk
(define (tree-walk tree walker proc)
  (walker (lambda (ele)
        (if (list? ele)
        (tree-walk ele walker proc)
        (proc ele)))
      tree))

 

(tree-walk '(1 (2 3 (4 5 6)) 7 8 9 (10 (11 (12)))) for-each print)
;; => gosh> 1
;; => 2
;; => 3
;; => 4
;; => 5
;; => 6
;; => 7
;; => 8
;; => 9
;; => 10
;; => 11
;; => 12
;; => #<undef>

 

listを反転させるreverse。

;; reverse
(define (reverse ls)
  (define (rev-iter ls ret)
    (if (null? ls)
    ret
    (rev-iter (cdr ls)(cons (car ls) ret))))
  (rev-iter ls '()))

 

(reverse '(1 2 3 4 5)) ;; => (5 4 3 2 1)

 

 

listを反転後にfor-eachするreverse-for-each。

;; reverse-for-each
(define (reverse-for-each proc ls)
  (for-each proc (reverse ls)))

 

(reverse-for-each print '(1 2 3 4 5))
;; => gosh> 5
;; => 4
;; => 3
;; => 2
;; => 1
;; => #<undef>

 

tree-walkにreverse-for-eachとprintを渡してみる。
今気づいたけど、本に書いてあるコードと引数の順番違う。

(tree-walk '(1 (2 3 (4 5 6)) 7 8 9 (10 (11 (12)))) reverse-for-each print)
;; => gosh> 12
;; => 11
;; => 10
;; => 9
;; => 8
;; => 7
;; => 6
;; => 5
;; => 4
;; => 3
;; => 2
;; => 1
;; => #<undef>

0 件のコメント:

コメントを投稿