今度はわかるぞ。
shuffle は align と似ているけど、7章で出てきた revpair を使う。
(use mymodule) (define revpair (lambda (pair) (build (second pair) (first pair)))) (define shuffle (lambda (pora) (cond ((atom? pora) pora) ((a-pair? (first pora)) (shuffle (revpair pora))) (else (build (first pora) (shuffle (second pora))))))) (print (shuffle '(a (b c)))) (print (shuffle '(a b)))
^o^ > gosh -I. shuffle.scm (a (b c)) (a b)
うまく動いているようだ。ということは全関数なんだろうか。
ここで、(shuffle '((a b) (c d)))
の値を求めてみる。引数の第1要素がペアなので、cond の2番目に当たる。すると (shuffle (revpair '((a b) (c d))))
と再帰してこれは (shuffle '((c d) (a b)))
に同じ。さらに進めるとまた cond の2番目にあたり、(shuffle (revpair '((c d) (a b))))
となり、これは (shuffle '((a b) (c d)))
と同じになる。つまり、最初と同じになってしまう。
というわけで、shuffle は引数によっては停止しない部分関数ということになる。