Jonathan S. Shapiro wrote: > On Wed, 2008-03-12 at 18:24 -0400, Swaroop Sridhar wrote: >> Jonathan S. Shapiro wrote: >>> On Wed, 2008-03-12 at 14:14 -0400, Swaroop Sridhar wrote: >>> Unfortunately, your statement [2] is wrong. Counter-example: >>> >>> (define (g) >>> (let ((local : (mutable int32) 1) >>> (letrec ((closure >>> ((lambda (lref:(by-ref (mutable 'a))) >>> (lambda (x) >>> (set! lref (+ lref 1)) >>> (+ lref x))) local))) >>> (pair (closure 1) (closure 1))))) >>> >>> If your theory were correct, the result should be (2, 2). But it is >>> clear here that the outer lambda has closed over "local" by means of >>> application, and the correct answer must be (2, 3). >> I don't see why (2) is wrong here. ... >> > (2) is wrong here because we are looking for a pair, so I don't know how > to respond to this. Can you clarify?
(2) is not the return value of the expression. I was referring to my condition [2] (since you said [2] was wrong) which was: >>> A capture of a by-ref formal variable (x) by an >>> inner lambda (L) is safe only if: >>> >>> (1) L does not escape, or >>> (2) The body of L does not use x as an lvalue that is a target of an >>> assignment. For the above definition, my understanding is that the inner lambda (with parameter x) escapes because it is being returned, so [condition 1] is not satisfied. It assigns a non-local by-ref variable lref so [condition 2] is not satisfied. So, this definition would be rejected by the compiler. I am writing this just for the sake of clarification, not that we should adapt it in lieu of the simplest solution. Swaroop. _______________________________________________ bitc-dev mailing list bitc-dev@coyotos.org http://www.coyotos.org/mailman/listinfo/bitc-dev