1
Fork 0
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:
Dirk Herrmann 2004-06-06 07:46:18 +00:00
parent 9ccea37043
commit 212e58ede8
6 changed files with 595 additions and 321 deletions

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
* 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}.")