From: David Kastrup <dak@gnu.org>
To: Mark H Weaver <mhw@netris.org>
Cc: Andy Wingo <wingo@pobox.com>, guile-devel@gnu.org
Subject: Re: Anything better for delayed lexical evaluation than (lambda () ...)?
Date: Wed, 14 Dec 2011 09:16:09 +0100 [thread overview]
Message-ID: <87r507bmba.fsf@fencepost.gnu.org> (raw)
In-Reply-To: <87k460ngf3.fsf@netris.org> (Mark H. Weaver's message of "Tue, 13 Dec 2011 19:30:24 -0500")
Mark H Weaver <mhw@netris.org> writes:
> Andy Wingo <wingo@pobox.com> writes:
>> On Wed 14 Dec 2011 00:00, Noah Lavine <noah.b.lavine@gmail.com> writes:
>>> I haven't really been contributing to this thread, so please take my
>>> opinion with a grain of salt. But it does appear to me that we should
>>> support capturing a lexical environment, as Mark and David describe.
>>>
>>> So I took a look at ice-9/eval.scm....
>>
>> The details of the interpreter's implementation are not public, I'm
>> afraid. The interpreter does its job, but not quickly, and any change
>> to make it better would involve a change to the environment
>> representation.
>
> I agree that the returned "lexical environment object" should opaque.
> Probably the only operation that needs this object is "local-eval",
> though I'm not sure there's any disadvantage to printing it in
> human-readable form for debugging purposes.
I was actually somewhat surprised that one could not just use "eval"
here and give it the environment instead of a module argument. It is
not actually obvious from the documentation whether the active module is
part of the environment or not.
To be fair, not much is obvious from the documentation of local-eval
(documented in Guile 1.8, one occurence of "memoized" in this version).
@c snarfed from debug.c:406
@deffn {Scheme Procedure} local-eval exp [env]
@deffnx {C Function} scm_local_eval (exp, env)
Evaluate @var{exp} in its environment. If @var{env} is supplied,
it is the environment in which to evaluate @var{exp}. Otherwise,
@var{exp} must be a memoized code object (in which case, its environment
is implicit).
@end deffn
>> Anyway, it's looking in the wrong place. There is a compiler too.
>
> The most obvious implementation of (capture-lexical-environment) would
> inhibit compilation of any top-level form that contains it.
Well, it probably is less invasive than the equivalent of marking every
local variable (similarly to global ones) as subject to change across
calls.
> Therefore, the only thing the compiler would need to do is detect the
> presence of (capture-lexical-environment), and in that case, abort
> compilation of the entire top-level form. I guess such a form should
> be "compiled" simply as a call to the evaluator with the entire
> top-level form as its argument. This would all happen after macro
> expansion, of course.
>
> Does this make sense?
Sounds a bit heavy-handed. For the use cases in Lilypond, I don't
expect noticeable slow-downs as long as "the evaluator" works with
reasonable performance for an interpreter and is not coded with the "we
have a compiler anyway, so this will only run in exceptional cases and
can be exceptionally slow" frame of mind.
But it does a reasonably simple job, and probably is not significantly
changed from Guile v1, so I don't expect much of a problem here.
So this would basically work for Lilypond. It would, however, be likely
a good idea to have it in a state where attaching strong-worded warnings
to the documentation is not necessary.
Something like "If an environment is being captured, the enclosing code
can't be optimized (in the current implementation, it is simply left
uncompiled). So it is a good idea to place performance-critical code in
functions separate from those where you need to capture the
environment." should likely be enough.
--
David Kastrup
next prev parent reply other threads:[~2011-12-14 8:16 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-03 15:45 Anything better for delayed lexical evaluation than (lambda () ...)? David Kastrup
2011-12-03 16:44 ` Andy Wingo
2011-12-06 14:55 ` Thien-Thi Nguyen
2011-12-06 15:45 ` David Kastrup
2011-12-06 19:50 ` Marco Maggi
2011-12-11 9:33 ` David Kastrup
2011-12-11 9:51 ` David Kastrup
2011-12-12 5:21 ` Mark H Weaver
2011-12-12 6:47 ` David Kastrup
2011-12-12 18:29 ` Mark H Weaver
2011-12-12 19:56 ` David Kastrup
2011-12-12 20:39 ` rixed
2011-12-12 21:02 ` David Kastrup
2011-12-12 21:58 ` Mark H Weaver
2011-12-12 21:40 ` Mark H Weaver
2011-12-12 21:50 ` Andy Wingo
2011-12-13 9:02 ` David Kastrup
2011-12-13 13:05 ` Andy Wingo
2011-12-13 13:56 ` David Kastrup
2011-12-13 14:34 ` Andy Wingo
2011-12-13 15:27 ` David Kastrup
2011-12-13 15:48 ` Andy Wingo
2011-12-13 16:08 ` David Kastrup
2011-12-13 16:27 ` Andy Wingo
2011-12-13 16:54 ` David Kastrup
2011-12-13 18:58 ` Andy Wingo
2011-12-13 22:23 ` David Kastrup
2011-12-13 17:28 ` Mark H Weaver
2011-12-13 18:49 ` Andy Wingo
2011-12-13 19:15 ` Mark H Weaver
2011-12-13 23:00 ` Noah Lavine
2011-12-13 23:16 ` David Kastrup
2011-12-13 23:44 ` Andy Wingo
2011-12-13 23:39 ` Andy Wingo
2011-12-13 23:45 ` David Kastrup
2011-12-14 10:15 ` Andy Wingo
2011-12-14 10:32 ` David Kastrup
2011-12-14 0:30 ` Mark H Weaver
2011-12-14 8:16 ` David Kastrup [this message]
2011-12-14 0:42 ` Noah Lavine
2011-12-14 0:47 ` Noah Lavine
2011-12-14 1:30 ` Mark H Weaver
2011-12-14 7:50 ` Mark H Weaver
2011-12-14 8:48 ` [PATCH] Implement `capture-lexical-environment' in evaluator Mark H Weaver
2011-12-14 9:08 ` David Kastrup
2011-12-14 9:36 ` Mark H Weaver
2011-12-16 9:21 ` [PATCH] Implement `the-environment' and `local-eval' " Mark H Weaver
2011-12-16 9:32 ` David Kastrup
2011-12-16 14:00 ` Peter TB Brett
2011-12-16 14:26 ` David Kastrup
2011-12-16 15:27 ` Mark H Weaver
2011-12-16 16:01 ` Andy Wingo
2011-12-16 17:44 ` Mark H Weaver
2011-12-16 19:12 ` Mark H Weaver
2012-01-07 1:26 ` Andy Wingo
2012-01-07 17:30 ` Mark H Weaver
2012-01-07 1:18 ` Andy Wingo
2011-12-16 16:59 ` Hans Aberg
2011-12-14 10:08 ` Anything better for delayed lexical evaluation than (lambda () ...)? Andy Wingo
2011-12-14 10:27 ` David Kastrup
2011-12-14 13:35 ` Andy Wingo
2011-12-14 15:21 ` David Kastrup
2011-12-14 15:55 ` Andy Wingo
2011-12-14 17:26 ` Mark H Weaver
2011-12-14 18:23 ` David Kastrup
2011-12-14 18:38 ` Mark H Weaver
2011-12-14 19:14 ` David Kastrup
2011-12-14 19:44 ` David Kastrup
2011-12-14 22:56 ` Andy Wingo
2011-12-14 11:03 ` Mark H Weaver
2011-12-14 11:18 ` David Kastrup
2011-12-14 13:31 ` Noah Lavine
2011-12-14 21:03 ` Mark H Weaver
2011-12-14 22:12 ` David Kastrup
2011-12-14 22:24 ` David Kastrup
2011-12-14 22:55 ` Andy Wingo
2011-12-13 16:24 ` David Kastrup
2011-12-13 15:52 ` David Kastrup
2011-12-13 11:14 ` David Kastrup
2011-12-14 13:52 ` Ludovic Courtès
2011-12-14 14:27 ` David Kastrup
2011-12-14 21:30 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87r507bmba.fsf@fencepost.gnu.org \
--to=dak@gnu.org \
--cc=guile-devel@gnu.org \
--cc=mhw@netris.org \
--cc=wingo@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).