2009/02/07

[scheme][Gauche]map

プログラミングGauche」 P.66

 

map
リストの各要素に引数の手続きを適用し、結果をリストにして返す。
リスト内の順序は保持されても、引数の手続きがリストの順番通りに適用される保証はない。

 

map

;; map
(map (lambda (n) (* n n)) '(1 2 3 4 5))
;; => (1 4 9 16 25)

 

mapにprint手続きを渡してみる。

(map (lambda (n) (print n)) '(1 2 3 4 5))
;; => gosh> 1
;; => 2
;; => 3
;; => 4
;; => 5
;; => (#<undef> #<undef> #<undef> #<undef> #<undef>)

 

 

mapにlambdaを渡してみる。

(map (lambda (n) (* n 2)) '(1 2 3 4 5))
;; => (2 4 6 8 10)

 

木構造リストの末端要素(リーフ)に手続き(proc)を適用するtree-walk。

走査手続きwalkerにはfor-each手続きを渡してみる。

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

 

tree-walkにmapを渡してみる。

;; tree-walk with map
(tree-walk map (lambda (n) (* n n)) '((1 2) 3 (4 (5 6 (7))) 8))
;; => ((1 4) 9 (16 (25 36 (49))) 64)

 

以前も書いたがリストを逆順にする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)

 

;; reverse
(define (reverse ls)
  (fold cons '() ls))

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

 

逆順に手続きを適用する。

;; reverse-map
(define (reverse-map proc ls)
  (map proc (reverse ls)))

(reverse-map (lambda (n) n) '((1 2) 3 (4 (5 6 (7))) 8))
;; => (8 (4 (5 6 (7))) 3 (1 2))

(tree-walk reverse-map (lambda (n) n) '((1 2) 3 (4 (5 6 (7))) 8))
;; => (8 (((7) 6 5) 4) 3 (2 1))

0 件のコメント:

コメントを投稿