diff options
author | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2004-06-06 07:46:18 +0000 |
---|---|---|
committer | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2004-06-06 07:46:18 +0000 |
commit | 212e58ede8e7e7cc074eb90ba3eab03afdd2641c (patch) | |
tree | d58329084fdfb96ffc034a97777dcccafd0ccf7b /libguile/debug.c | |
parent | 9ccea3704316ac2bdb7e0450d162a3a7c3273d95 (diff) | |
download | guile-212e58ede8e7e7cc074eb90ba3eab03afdd2641c.tar.gz |
* list.[ch] (scm_i_finite_list_copy): New internal function to
copy lists that are known to be finite (though not necessarily
proper).
* debug.c (scm_procedure_source): Don't have scm_unmemocopy treat
a closure's argument list like an expression of a body.
* eval.c (unmemoize_expression, unmemoize_exprs, unmemoize_and,
unmemoize_begin, unmemoize_case, unmemoize_cond, unmemoize_delay,
unmemoize_do, unmemoize_if, unmemoize_lambda, unmemoize_let,
unmemoize_letrec, unmemoize_letstar, unmemoize_or,
unmemoize_set_x, unmemoize_apply, unmemoize_atcall_cc,
unmemoize_at_call_with_values, unmemoize_future, sym_atslot_ref,
unmemoize_atslot_ref, sym_atslot_set_x, unmemoize_atslot_set_x,
unmemoize_builtin_macro): New static functions and symbols.
(scm_unmemocopy): Rewritten in terms of the above. scm_unmemocopy
now has a slightly different meaning: The memoized form that is
receives as its argument is now interpreted as a sequence of
expressions from a body.
(unmemocar, scm_unmemocar): Since the whole functionality of
unmemocar and scm_unmemocar is not needed any more, scm_unmemocar
has its old content back and is deprecated, while unmemocar has
been removed.
(SCM_BIT7): Removed.
(CEVAL): For unmemoizing a single expression, call
unmemoize_expression instead of scm_unmemocopy, which now expects
a sequence of body expressions. Eliminated unnecessary empty
environment frame when executing let* forms. Eliminated
unmemoization step from evaluator.
Diffstat (limited to 'libguile/debug.c')
-rw-r--r-- | libguile/debug.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/libguile/debug.c b/libguile/debug.c index 01bf656eb..ac2c4fe43 100644 --- a/libguile/debug.c +++ b/libguile/debug.c @@ -329,15 +329,21 @@ SCM_DEFINE (scm_procedure_source, "procedure-source", 1, 0, 0, switch (SCM_TYP7 (proc)) { case scm_tcs_closures: { - SCM formals = SCM_CLOSURE_FORMALS (proc); - SCM src = scm_source_property (SCM_CLOSURE_BODY (proc), scm_sym_copy); + const SCM formals = SCM_CLOSURE_FORMALS (proc); + const SCM body = SCM_CLOSURE_BODY (proc); + const SCM src = scm_source_property (body, scm_sym_copy); + if (!SCM_FALSEP (src)) - return scm_cons2 (scm_sym_lambda, formals, src); - return scm_cons (scm_sym_lambda, - scm_unmemocopy (SCM_CODE (proc), - SCM_EXTEND_ENV (formals, - SCM_EOL, - SCM_ENV (proc)))); + { + return scm_cons2 (scm_sym_lambda, formals, src); + } + else + { + const SCM env = SCM_EXTEND_ENV (formals, SCM_EOL, SCM_ENV (proc)); + return scm_cons2 (scm_sym_lambda, + scm_i_finite_list_copy (formals), + scm_unmemocopy (body, env)); + } } case scm_tcs_struct: if (!SCM_I_OPERATORP (proc)) |