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は「何か」からリストを作り出せると。
これは使えそうだ。