ACL(3) 3.7 マッピング関数

Common Lispには、map系関数が色々あるみたい。

mapcar

mapcarはSchemeで言う所のmap。

maplist

maplistは、carの代わりにcdr(リスト?)を取るmap。

(maplist #'(lambda (x) x) '(a b c))
;((A B C) (B C) (C))

うは、便利そうだ。

Schemeだと、srfi-1のpair-fold-rightが似た感じで使える。

(pair-fold-right cons
  '() '(a b c))
; ((a b c) (b c) (c))

pair-fold-rightはステキだ!!

maplistのSchemeバージョンpair-map-rightを作ってみる。

(define (pair-map-right f l)
  (if (null? l)
      '()
      (cons (f l)
            (pair-map-right f (cdr l)))))

(pair-map-right values '(a b c))
; ((a b c) (b c) (c))

マイライブラリに追加しとこう。

3.9 再帰の理解について

最初は再帰について否定的な考え方を持ってたけど、僕の頭の中は完全に再帰脳だ。

再帰は速度的に不利になることもあるけど、とにかく簡単。for,whileによる繰り返しの方が断然難しい。自分がこんなに難しい構文を使っていたのかと思うとゾッとしてしまう。

再帰にはちょっと訓練が必要だけど、理解してしまえば、難しいと思っていたアルゴリズムがいとも簡単に理解できてしまう。

もっと多くの人に関数型言語の魅力が伝わればいいんだけど、関数型言語は商用的にあんまり成功を納めてないので、なかなかね・・・。