[r6rs-discuss] [Formal] eliminate library export immutability loophole
On Tue, 20 Mar 2007, Andre van Tonder wrote:
> On Tue, 20 Mar 2007, Abdulaziz Ghuloum wrote:
>
>> On Mar 19, 2007, at 11:42 AM, AndrevanTonder wrote:
>>>
>>> Doesn't the example violate the LETREC* restriction, though?
>>>
>>> One restriction on letrec* is very important: it must be possible to
>>> evaluate
>>> each <init> without assigning or referring to the value the
>>> corresponding
>>> <variable> or the <variable> of any of the bindings that follow it in
>>> <bindings>.
>>>
>>> In particular, the second time the RHS of the (define x ....) binding is
>>> evaluated, you are actually referring (via the (cadr x) in set-y!) to
>>> the
>>> value of x itself. So the example may already be illegal.
>>
>> The program does not violate the letrec* restriction since in the second
>> time,
>> the value of x has already been determined (the first time around). The
>> program
>> never refers or assigns to any uninitialized bindings.
>
> That is not what the letrec* restriction says. The letrec* restriction
> quoted above says nothing about whether the binding is uninitialized. The
> <undefined> implementation strategy is mentioned only later, where it is
> called approximate.
In fact, the letrec* restriction can be read to imply that the
following expression, using /internal/ definition, is also invalid:
(let ()
(define x (call/cc (lambda (k) k)))
(unless (number? x)
(x 1)))
since the second evaluation of the RHS of the definition is
needs a preceding reference to x to proceed.
I would actually support outlawing mutiple returns to
all definitions, including internal definitions, for the
following reasons:
- I suspect that it may make certain optimizations
(such as detecting possibilities for inlining or direct
substitution) more difficult. It is no longer sufficient
to detect set! statements to determine mutability.
Mutability detection becomes undecidable.
- Overloading the meaning of DEFINE to effect mutations
is unnecessary and just feels like an abuse to me.
The intention of mutation does not get clearly expressed.
I think it would be better if programmers were required to
express all mutations using set!. In other words, I think
programmers should be required to write the above as
(let ()
(define x)
(set! x (call/cc (lambda (k) k))))
(unless (number? x)
(x 1)))
instead.
Andre
Received on Tue Mar 20 2007 - 12:56:29 UTC
This archive was generated by hypermail 2.3.0
: Wed Oct 23 2024 - 09:15:01 UTC