fork download
  1. ;;; shift / reset を使った A 正規形変換
  2. ;;; 『shift/reset プログラミング入門』
  3. ;;; http://p...content-available-to-author-only...c.jp/‾asai/cw2011tutorial/main-j.pdf
  4. ;;; pp. 11--12
  5. (use gauche.partcont)
  6.  
  7. ;; Racket の場合
  8. ;; (require racket/control)
  9.  
  10. (define (a-normal term)
  11. (cond ((and (pair? term)
  12. (eq? (car term) 'lambda))
  13. (let ((var (car (cadr term)))
  14. (body (caddr term)))
  15. `(lambda (,var) ,(reset (a-normal body)))))
  16. ((pair? term)
  17. (let ((abs (car term))
  18. (arg (cadr term)))
  19. (shift k
  20. (let* ((v (gensym))
  21. (body (k v)))
  22. `(let ((,v (,(a-normal abs) ,(a-normal arg))))
  23. ,body)))))
  24. (else term)))
  25.  
  26. (a-normal '(lambda (x) (lambda (y) (x y))))
  27. ;; Gauche:
  28. ;; => *** ERROR: attempt to return from a ghost continuation.
  29. ;; Racket:
  30. ;; => '(lambda (x) (lambda (y) (let ((g1233 (x y))) g1233)))
  31.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty