unfoldのメモ
unfoldが便利っぽい。メモメモ
gaucheのマニュアルを見ると、
Function: unfold p f g seed &optional tail-gen
[SRFI-1] 基本リスト再帰構築子です。以下のように再帰的に定義されています。
(unfold p f g seed tail-gen) ==
(if (p seed)
(tail-gen seed)
(cons (f seed)
(unfold p f g (g seed))))
Function: unfold-right p f g seed &optional tail
[SRFI-1] 基本リスト反復構築子です。以下のように再帰的に定義されています。
(unfold-right p f g seed tail) ==
(let lp ((seed seed) (lis tail))
(if (p seed)
lis
(lp (g seed) (cons (f seed) lis))))イマイチわかりにくいけど、要約すると、
(unfold 終わり 作用させるやつ 減らすやつ 種)
ということらしい。
お試し。
(unfold zero? values (lambda (n) (- n 1)) 10) ; (10 9 8 7 6 5 4 3 2 1)
10,9,8,7...あぁ、なるほど。
unfold-rightで逆順に
(unfold-right zero? values (lambda (n) (- n 1)) 10) ; (1 2 3 4 5 6 7 8 9 10)
うは便利。
seedにリストを入れることも出来るので応用範囲はfold以上に広いかもしれない。
mapみたいに。
(unfold null? car cdr (iota 10)) ; (0 1 2 3 4 5 6 7 8 9)
reverse。
(unfold-right null? car cdr (iota 10)) ; (9 8 7 6 5 4 3 2 1 0)
楽しい。
unfoldは「何か」からリストを作り出せると。
これは使えそうだ。