David Kastrup <d...@gnu.org> writes:

> Mark H Weaver <m...@netris.org> writes:
>
>> David Kastrup <d...@gnu.org> writes:
>>
>>> Mark H Weaver <m...@netris.org> writes:
>>>
>>>> David Kastrup <d...@gnu.org> writes:
>>>>
>>>>> I am not sure that the reasons for not permitting definition context in
>>>>> local-eval are not of somewhat more theoretical than practical nature,
>>>>
>>>> There's at least one practical reason not to allow it, namely that it is
>>>> _impossible_ to implement.  Consider this:
>>>>
>>>>   (let ((x 1))
>>>>     (define (get-x) x)
>>>>     (the-environment))
>>>>
>>>> If we allow (the-environment) to add definitions to the implicit
>>>> `letrec',
>>>
>>> Then just let's not allow it.  Consider the body of local-eval to be
>>> wrapped inside of an implicit (begin ...).
>>
>> I think you mean an implicit (let () ...).  If that's what you want,
>> then you can do it yourself, and the result will be less likely to
>> confuse.
>
> What is confusing here?  "Obviously, definitions made in the scope of
> local-eval can't retroactively affect the environment where
> the-environment was called."  And now instead of continuing with the
> unfriendly "For this reason, they are prohibited." we continue with "You
> may consider the local-eval body as being wrapped inside of an implicit
> (let () ...)."

If you want to include local definitions, then you'll need to wrap the
form passed to `local-eval' within (begin ...) anyway.  If you're doing
that, why not just wrap them in (let () ...) instead?  Is it really more
work to type #`(let () #,@forms) than #`(begin #,@forms) ?

I would like for users to be able to use the simple mental model that
the local expression is simply put in place of (the-environment).
I'd also like to achieve the following source-level equivalence:

  <expr> == (local-eval '<expr> (the-environment))

You are suggesting that we wrap the expression within a (let () ...),
for the dubious benefit of allowing you to wrap the local forms in
(begin ...) instead of (let () ...).

I don't see any compelling benefit to this.  On the other hand, I see
less elegant semantics and potential confusion among users, who might
reasonably expect the definitions in their (begin ...) to be added to
the implicit `letrec', as would happen if the (begin ...) were put in
place of (the-environment).

     Mark

Reply via email to