1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 11:50:28 +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:
Dirk Herrmann 2004-06-06 07:46:18 +00:00
parent 9ccea37043
commit 212e58ede8
6 changed files with 595 additions and 321 deletions

7
NEWS
View file

@ -804,6 +804,13 @@ Guile always defines
scm_t_timespec 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 ** The macro SCM_IFLAGP now only returns true for flags
User code should never have used this macro anyway. And, you should not use User code should never have used this macro anyway. And, you should not use

View file

@ -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> 2004-06-02 Marius Vollmer <marius.vollmer@uni-dortmund.de>
* eval.c (scm_macroexp, macroexp): Renamed scm_macroexp to * eval.c (scm_macroexp, macroexp): Renamed scm_macroexp to

View file

@ -329,15 +329,21 @@ SCM_DEFINE (scm_procedure_source, "procedure-source", 1, 0, 0,
switch (SCM_TYP7 (proc)) { switch (SCM_TYP7 (proc)) {
case scm_tcs_closures: case scm_tcs_closures:
{ {
SCM formals = SCM_CLOSURE_FORMALS (proc); const SCM formals = SCM_CLOSURE_FORMALS (proc);
SCM src = scm_source_property (SCM_CLOSURE_BODY (proc), scm_sym_copy); const SCM body = SCM_CLOSURE_BODY (proc);
const SCM src = scm_source_property (body, scm_sym_copy);
if (!SCM_FALSEP (src)) if (!SCM_FALSEP (src))
{
return scm_cons2 (scm_sym_lambda, formals, src); return scm_cons2 (scm_sym_lambda, formals, src);
return scm_cons (scm_sym_lambda, }
scm_unmemocopy (SCM_CODE (proc), else
SCM_EXTEND_ENV (formals, {
SCM_EOL, const SCM env = SCM_EXTEND_ENV (formals, SCM_EOL, SCM_ENV (proc));
SCM_ENV (proc)))); return scm_cons2 (scm_sym_lambda,
scm_i_finite_list_copy (formals),
scm_unmemocopy (body, env));
}
} }
case scm_tcs_struct: case scm_tcs_struct:
if (!SCM_I_OPERATORP (proc)) if (!SCM_I_OPERATORP (proc))

File diff suppressed because it is too large Load diff

View file

@ -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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * 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 #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_DEFINE (scm_list_copy, "list-copy", 1, 0, 0,
(SCM lst), (SCM lst),
"Return a (newly-created) copy of @var{lst}.") "Return a (newly-created) copy of @var{lst}.")

View file

@ -3,7 +3,8 @@
#ifndef SCM_LIST_H #ifndef SCM_LIST_H
#define 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * 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_delete1_x (SCM item, SCM lst);
SCM_API SCM scm_filter (SCM pred, SCM list); SCM_API SCM scm_filter (SCM pred, SCM list);
SCM_API SCM scm_filter_x (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); SCM_API void scm_init_list (void);
#endif /* SCM_LIST_H */ #endif /* SCM_LIST_H */