mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-29 19:30:36 +02:00
srfi-1 remove: move from C to Scheme
The Scheme implementation is an adapted version of the approach used by delete-duplicates, which allows sharing any common tail. * libguile/srfi-1.c (scm_srfi1_remove): delete. * libguile/srfi-1.h (scm_srfi1_remove): delete. * module/srfi/srfi-1.scm: add remove.
This commit is contained in:
parent
aa44035ee8
commit
03d4a3b5df
3 changed files with 47 additions and 32 deletions
|
@ -772,37 +772,6 @@ SCM_DEFINE (scm_srfi1_partition_x, "partition!", 2, 0, 0,
|
|||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
SCM_DEFINE (scm_srfi1_remove, "remove", 2, 0, 0,
|
||||
(SCM pred, SCM list),
|
||||
"Return a list containing all elements from @var{list} which do\n"
|
||||
"not satisfy the predicate @var{pred}. The elements in the\n"
|
||||
"result list have the same order as in @var{list}. The order in\n"
|
||||
"which @var{pred} is applied to the list elements is not\n"
|
||||
"specified.")
|
||||
#define FUNC_NAME s_scm_srfi1_remove
|
||||
{
|
||||
SCM walk;
|
||||
SCM *prev;
|
||||
SCM res = SCM_EOL;
|
||||
SCM_VALIDATE_PROC (SCM_ARG1, pred);
|
||||
SCM_VALIDATE_LIST (2, list);
|
||||
|
||||
for (prev = &res, walk = list;
|
||||
scm_is_pair (walk);
|
||||
walk = SCM_CDR (walk))
|
||||
{
|
||||
if (scm_is_false (scm_call_1 (pred, SCM_CAR (walk))))
|
||||
{
|
||||
*prev = scm_cons (SCM_CAR (walk), SCM_EOL);
|
||||
prev = SCM_CDRLOC (*prev);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
|
||||
SCM_DEFINE (scm_srfi1_remove_x, "remove!", 2, 0, 0,
|
||||
(SCM pred, SCM list),
|
||||
"Return a list containing all elements from @var{list} which do\n"
|
||||
|
|
|
@ -37,7 +37,6 @@ SCM_INTERNAL SCM scm_srfi1_length_plus (SCM lst);
|
|||
SCM_INTERNAL SCM scm_srfi1_lset_difference_x (SCM equal, SCM lst, SCM rest);
|
||||
SCM_INTERNAL SCM scm_srfi1_partition (SCM pred, SCM list);
|
||||
SCM_INTERNAL SCM scm_srfi1_partition_x (SCM pred, SCM list);
|
||||
SCM_INTERNAL SCM scm_srfi1_remove (SCM pred, SCM list);
|
||||
SCM_INTERNAL SCM scm_srfi1_remove_x (SCM pred, SCM list);
|
||||
|
||||
SCM_INTERNAL void scm_register_srfi_1 (void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue