8章では収集子関数といっていたけど、「継続(continuation)」というほうが一般的みたいだ。この、継続を関数として再帰するスタイルを「継続渡しスタイル(Continuation Passing Style、CPS)と呼ぶみたい。
で、簡単な例で練習。この関数 evens-and-odds は、与えられた数のリストから、偶数だけのリストと奇数だけのリストを作る。最後に friend がリストのペアにして返している。
(define evens-and-odds (lambda (l co) (cond ((null? l) (co (quote ()) (quote ()))) ((even? (car l)) (evens-and-odds (cdr l) (lambda (e o) (co (cons (car l) e) o)))) (else (evens-and-odds (cdr l) (lambda (e o) (co e (cons (car l) o)))))))) (define friend (lambda (x y) (cons x (cons y (quote ()))))) (print (evens-and-odds '(1 2 3 4 5 6 7 8 9 10) friend))
^o^ > gosh evens-and-odds.scm ((2 4 6 8 10) (1 3 5 7 9))
うん、うまくいった。