リスト(1 2 3)というものは次のようにして構成されます。
(cons 1 (cons 2 (cons 3 '())))
(cons a b) を (a . b) と書くことにすれば、
(1 . (2 . (3 . '())))
です。ところで、自然数123というのは、通常10進法で表記しているわけですが、これは次のようにして定義されています。
3 + 10*( 2 + 10*(1 + 10*0)))
似ていますね。このような対象同士を相互に変換するのがfold とunfold-right です。
(fold (lambda (a b) (+ (* b 10) a )) 0 '(1 2 3)) ==> 123
(unfold-right zero? (lambda (n) (modulo n 10))
(lambda (n) (quotient n 10))
123) ==> (1 2 3)
unfold だとリストの構造上逆に表記されます。その場合fold-right で元に戻ります。
(unfold zero? (lambda (n) (modulo n 10))
(lambda (n) (quotient n 10))
123) ==> (3 2 1)
(fold-right (lambda (a b) (+ (* b 10) a )) 0 '(3 2 1)) ==> 123
0 件のコメント:
コメントを投稿