mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
* 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.
This commit is contained in:
parent
9ccea37043
commit
212e58ede8
6 changed files with 595 additions and 321 deletions
7
NEWS
7
NEWS
|
@ -804,6 +804,13 @@ Guile always defines
|
|||
|
||||
scm_t_timespec
|
||||
|
||||
** The function scm_unmemocopy now expects a sequence of body forms
|
||||
|
||||
Formerly, scm_unmemocopy would have accepted both, a single expression and a
|
||||
sequence of body forms for unmemoization. Now, it only accepts only a
|
||||
sequence of body forms, which was the normal way of using it. Passing it a
|
||||
single expression won't work any more.
|
||||
|
||||
** The macro SCM_IFLAGP now only returns true for flags
|
||||
|
||||
User code should never have used this macro anyway. And, you should not use
|
||||
|
|
|
@ -1,3 +1,39 @@
|
|||
2004-06-06 Dirk Herrmann <dirk@dirk-herrmanns-seiten.de>
|
||||
|
||||
* 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.
|
||||
|
||||
2004-06-02 Marius Vollmer <marius.vollmer@uni-dortmund.de>
|
||||
|
||||
* eval.c (scm_macroexp, macroexp): Renamed scm_macroexp to
|
||||
|
|
|
@ -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))));
|
||||
}
|
||||
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))
|
||||
|
|
811
libguile/eval.c
811
libguile/eval.c
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,5 @@
|
|||
/* Copyright (C) 1995,1996,1997,2000,2001, 2003, 2004 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995,1996,1997,2000,2001,2003,2004
|
||||
* Free Software Foundation, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -500,6 +501,34 @@ SCM_DEFINE (scm_list_head, "list-head", 2, 0, 0,
|
|||
#undef FUNC_NAME
|
||||
|
||||
|
||||
/* Copy a list which is known to be finite. The last pair may or may not have
|
||||
* a '() in its cdr. That is, improper lists are accepted. */
|
||||
SCM
|
||||
scm_i_finite_list_copy (SCM list)
|
||||
{
|
||||
if (!SCM_CONSP (list))
|
||||
{
|
||||
return list;
|
||||
}
|
||||
else
|
||||
{
|
||||
SCM tail;
|
||||
const SCM result = tail = scm_list_1 (SCM_CAR (list));
|
||||
list = SCM_CDR (list);
|
||||
while (SCM_CONSP (list))
|
||||
{
|
||||
const SCM new_tail = scm_list_1 (SCM_CAR (list));
|
||||
SCM_SETCDR (tail, new_tail);
|
||||
tail = new_tail;
|
||||
list = SCM_CDR (list);
|
||||
}
|
||||
SCM_SETCDR (tail, list);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SCM_DEFINE (scm_list_copy, "list-copy", 1, 0, 0,
|
||||
(SCM lst),
|
||||
"Return a (newly-created) copy of @var{lst}.")
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
#ifndef SCM_LIST_H
|
||||
#define SCM_LIST_H
|
||||
|
||||
/* Copyright (C) 1995,1996,1997,2000,2001, 2003 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995,1996,1997,2000,2001,2003,2004
|
||||
* Free Software Foundation, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -64,6 +65,12 @@ SCM_API SCM scm_delv1_x (SCM item, SCM lst);
|
|||
SCM_API SCM scm_delete1_x (SCM item, SCM lst);
|
||||
SCM_API SCM scm_filter (SCM pred, SCM list);
|
||||
SCM_API SCM scm_filter_x (SCM pred, SCM list);
|
||||
|
||||
|
||||
|
||||
/* Guile internal functions */
|
||||
|
||||
SCM_API SCM scm_i_finite_list_copy (SCM /* a list known to be finite */);
|
||||
SCM_API void scm_init_list (void);
|
||||
|
||||
#endif /* SCM_LIST_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue