[plt-scheme] about letrec and continuation : which behavior is correct ? and why ?
Here is a proof that this must evaluate to #t. -- Matthias
(letrec ((x (call/cc list)))
(if (pair? x)
((car x) (lambda () x))
(pair? (x))))
=>
(letrec ((x (list *E*))
(if (pair? x)
((car x) (lambda () x))
(pair? (x)))))
where *E* =
(letrec ((x []))
(if (pair? x)
((car x) (lambda () x))
(pair? (x))))
=>
(if (pair? (list *E*))
((car (list *E*)) (lambda () (list *E*)))
(pair? ((list *E*))))
=>
((car (list *E*)) (lambda () (list *E*)))
=>
(*E* (lambda () (list *E*)))
=>
(letrec ((x (lambda () (list *E*))))
(if (pair? x)
((car x) (lambda () x))
(pair? (x))))
=>
(if (pair? (lambda () (list *E*)))
((car (lambda () (list *E*))) (lambda () (lambda () (list *E*))))
(pair? ((lambda () (list *E*)))))
=>
(pair? ((lambda () (list *E*))))
=>
(pair? (list *E*))
=>
#t