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/list.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/list.c')
-rw-r--r-- | libguile/list.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/libguile/list.c b/libguile/list.c index 71ebf6642..213613712 100644 --- a/libguile/list.c +++ b/libguile/list.c @@ -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}.") |