;;; shift / reset を使った A 正規形変換
;;; 『shift/reset プログラミング入門』
;;; http://p...content-available-to-author-only...c.jp/‾asai/cw2011tutorial/main-j.pdf
;;; pp. 11--12
(use gauche.partcont)
;; Racket の場合
;; (require racket/control)
(define (a-normal term)
(cond ((and (pair? term)
(eq? (car term) 'lambda))
(let ((var (car (cadr term)))
(body (caddr term)))
`(lambda (,var) ,(reset (a-normal body)))))
((pair? term)
(let ((abs (car term))
(arg (cadr term)))
(shift k
(let* ((v (gensym))
(body (k v)))
`(let ((,v (,(a-normal abs) ,(a-normal arg))))
,body)))))
(else term)))
(a-normal '(lambda (x) (lambda (y) (x y))))
;; Gauche:
;; => *** ERROR: attempt to return from a ghost continuation.
;; Racket:
;; => '(lambda (x) (lambda (y) (let ((g1233 (x y))) g1233)))
Ozs7IHNoaWZ0IC8gcmVzZXQg44KS5L2/44Gj44GfIEEg5q2j6KaP5b2i5aSJ5o+bCjs7OyDjgI5zaGlmdC9yZXNldCDjg5fjg63jgrDjg6njg5/jg7PjgrDlhaXploDjgI8KOzs7IGh0dHA6Ly9wLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5jLmpwL+KAvmFzYWkvY3cyMDExdHV0b3JpYWwvbWFpbi1qLnBkZgo7OzsgcHAuIDExLS0xMgoodXNlIGdhdWNoZS5wYXJ0Y29udCkKCjs7IFJhY2tldCDjga7loLTlkIgKOzsgKHJlcXVpcmUgcmFja2V0L2NvbnRyb2wpCgooZGVmaW5lIChhLW5vcm1hbCB0ZXJtKQogIChjb25kICgoYW5kIChwYWlyPyB0ZXJtKQogICAgICAgICAgICAgIChlcT8gKGNhciB0ZXJtKSAnbGFtYmRhKSkKICAgICAgICAgKGxldCAoKHZhciAoY2FyIChjYWRyIHRlcm0pKSkKICAgICAgICAgICAgICAgKGJvZHkgKGNhZGRyIHRlcm0pKSkKICAgICAgICAgICBgKGxhbWJkYSAoLHZhcikgLChyZXNldCAoYS1ub3JtYWwgYm9keSkpKSkpCiAgICAgICAgKChwYWlyPyB0ZXJtKQogICAgICAgICAobGV0ICgoYWJzIChjYXIgdGVybSkpCiAgICAgICAgICAgICAgIChhcmcgKGNhZHIgdGVybSkpKQogICAgICAgICAgIChzaGlmdCBrCiAgICAgICAgICAgICAobGV0KiAoKHYgKGdlbnN5bSkpCiAgICAgICAgICAgICAgICAgICAgKGJvZHkgKGsgdikpKQogICAgICAgICAgICAgICBgKGxldCAoKCx2ICgsKGEtbm9ybWFsIGFicykgLChhLW5vcm1hbCBhcmcpKSkpCiAgICAgICAgICAgICAgICAgICxib2R5KSkpKSkKICAgICAgICAoZWxzZSB0ZXJtKSkpCgooYS1ub3JtYWwgJyhsYW1iZGEgKHgpIChsYW1iZGEgKHkpICh4IHkpKSkpCjs7IEdhdWNoZToKOzsgPT4gKioqIEVSUk9SOiBhdHRlbXB0IHRvIHJldHVybiBmcm9tIGEgZ2hvc3QgY29udGludWF0aW9uLgo7OyBSYWNrZXQ6Cjs7ID0+ICcobGFtYmRhICh4KSAobGFtYmRhICh5KSAobGV0ICgoZzEyMzMgKHggeSkpKSBnMTIzMykpKQo=