継続(continuation)の練習

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))

うん、うまくいった。

「継続(continuation)の練習」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください