[plt-scheme] about letrec and continuation : which behavior is	correct ? and why ?
At Tue, 19 Aug 2008 09:59:44 -0400, Matthias Felleisen wrote:
> 
> Here is a proof that this must evaluate to #t.
I believe that matches the semantics of PLT Scheme's `letrec'.
The R5RS/R6RS `letrec' is different, and the result with that other
`letrec' should be #f:
(letrec ((x (call/cc list)))
   (if (pair? x)
       ((car x) (lambda () x))
       (pair? (x))))
= 
(let ((x #f))
   (set! x (call/cc list))
   (if (pair? x)
       ((car x) (lambda () x))
       (pair? (x))))
=>
(define x_0 #f)
(begin 
  (set! x (call/cc list))
  (if (pair? x_0)
      ((car x_0) (lambda () x_0))
      (pair? (x_0)))))
=>
(define x_0 #f)
(begin 
  (set! x (list *E*))
  (if (pair? x_0)
      ((car x_0) (lambda () x_0))
      (pair? (x_0)))))
where *E* =
  (begin
    (set! x_0 [])
    (if (pair? x_0)
        ((car x_0) (lambda () x_0))
        (pair? (x_0))))
=>
(define x_0 (list *E*))
(if (pair? x_0)
    ((car x_0) (lambda () x_0))
    (pair? (x_0)))
=>
(define x_0 (list *E*))
(if (pair? (list *E*))
    ((car x_0) (lambda () x_0))
    (pair? (x_0)))
=>
(define x_0 (list *E*))
((car x_0) (lambda () x_0))
=>
(define x_0 (list *E*))
(*E* (lambda () x_0))
=>
(define x_0 (list *E*))
(begin
 (set! x_0 (lambda () x_0))
 (if (pair? x_0)
     ((car x_0) (lambda () x_0))
     (pair? (x_0))))
=>
(define x_0 (lambda () x_0))
(if (pair? x_0)
    ((car x_0) (lambda () x_0))
    (pair? (x_0)))
=>
(pair? (x_0))
=>
(pair? ((lambda () x_0)))
=>
(pair? x_0)
=>
(pair? (lambda () x_0))
=>
#f