CPSでhello

うまく動くかgaucheで試してみた。worldは略。
まず普通に。

(display "h")
(display "e")
(display "l")
(display "l")
(display "o")
(newline)

引数を取れるように小細工。

(define (h dummy) (display "h"))
(define (e dummy) (display "e"))
(define (l dummy) (display "l"))
(define (o dummy) (display "o"))
(define (nl dummy) (newline))

合成できるようになった。チェック。

(h ())
(e ())
(l ())
(l ())
(o ())
(nl ())

(nl (o (l (l (e (h ()))))))

それぞれCPS変換(たぶん)をする。

(define (h* cont)
  (lambda (x)
    (cont (h x))))

(define (e* cont)
  (lambda (x)
    (cont (e x))))

(define (l* cont)
  (lambda (x)
    (cont (l x))))

(define (o* cont)
  (lambda (x)
    (cont (o x))))

(define (nl* cont)
  (lambda (x)
    (cont (nl x))))

CPSで書く。

((h* (e* (l* (l* (o* (nl* identity))))))
 () )

これはこれでうまく行った。
h*の定義でhを使っていいのか少し悩んだけど、後で考えることにした。
継続渡しの例でよく見る再帰版階乗のやつは、変換したあとも再帰で自己完結してたりしてまだよく理解してない。