[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 04/17: srfi-1 delete delete!: move from C to Scheme
From: |
Rob Browning |
Subject: |
[Guile-commits] 04/17: srfi-1 delete delete!: move from C to Scheme |
Date: |
Tue, 30 Jul 2024 20:41:53 -0400 (EDT) |
rlb pushed a commit to branch main
in repository guile.
commit a816b2484bae69edaf78ae2b0cb0c8f6005e0a8b
Author: Rob Browning <rlb@defaultvalue.org>
AuthorDate: Tue Jul 16 23:19:15 2024 -0500
srfi-1 delete delete!: move from C to Scheme
* libguile/srfi-1.c (scm_srfi1_delete, scm_srfi1_delete_x): delete.
* libguile/srfi-1.h (scm_srfi1_delete, scm_srfi1_delete_x): delete.
* module/srfi/srfi-1.scm: add delete and delete!.
---
libguile/srfi-1.c | 111 -------------------------------------------------
libguile/srfi-1.h | 2 -
module/srfi/srfi-1.scm | 35 ++++++++++++++++
3 files changed, 35 insertions(+), 113 deletions(-)
diff --git a/libguile/srfi-1.c b/libguile/srfi-1.c
index be78c1f2f..a03a5469e 100644
--- a/libguile/srfi-1.c
+++ b/libguile/srfi-1.c
@@ -277,117 +277,6 @@ SCM_DEFINE (scm_srfi1_count, "count", 2, 0, 1,
#undef FUNC_NAME
-SCM_DEFINE (scm_srfi1_delete, "delete", 2, 1, 0,
- (SCM x, SCM lst, SCM pred),
- "Return a list containing the elements of @var{lst} but with\n"
- "those equal to @var{x} deleted. The returned elements will be\n"
- "in the same order as they were in @var{lst}.\n"
- "\n"
- "Equality is determined by @var{pred}, or @code{equal?} if not\n"
- "given. An equality call is made just once for each element,\n"
- "but the order in which the calls are made on the elements is\n"
- "unspecified.\n"
- "\n"
- "The equality calls are always @code{(pred x elem)}, ie.@: the\n"
- "given @var{x} is first. This means for instance elements\n"
- "greater than 5 can be deleted with @code{(delete 5 lst <)}.\n"
- "\n"
- "@var{lst} is not modified, but the returned list might share a\n"
- "common tail with @var{lst}.")
-#define FUNC_NAME s_scm_srfi1_delete
-{
- SCM ret, *p, keeplst;
- int count;
-
- if (SCM_UNBNDP (pred))
- return scm_delete (x, lst);
-
- SCM_ASSERT (scm_is_true (scm_procedure_p (pred)), pred, SCM_ARG3, FUNC_NAME);
-
- /* ret is the return list being constructed. p is where to append to it,
- initially &ret then SCM_CDRLOC of the last pair. lst progresses as
- elements are considered.
-
- Elements to be retained are not immediately copied, instead keeplst is
- the last pair in lst which is to be retained but not yet copied, count
- is how many from there are wanted. When there's no more deletions, *p
- can be set to keeplst to share the remainder of the original lst. (The
- entire original lst if there's no deletions at all.) */
-
- keeplst = lst;
- count = 0;
- p = &ret;
-
- for ( ; scm_is_pair (lst); lst = SCM_CDR (lst))
- {
- if (scm_is_true (scm_call_2 (pred, x, SCM_CAR (lst))))
- {
- /* delete this element, so copy those at keeplst */
- p = list_copy_part (keeplst, count, p);
- keeplst = SCM_CDR (lst);
- count = 0;
- }
- else
- {
- /* keep this element */
- count++;
- }
- }
-
- /* final retained elements */
- *p = keeplst;
-
- /* demand that lst was a proper list */
- SCM_ASSERT_TYPE (SCM_NULL_OR_NIL_P (lst), lst, SCM_ARG2, FUNC_NAME, "list");
-
- return ret;
-}
-#undef FUNC_NAME
-
-
-SCM_DEFINE (scm_srfi1_delete_x, "delete!", 2, 1, 0,
- (SCM x, SCM lst, SCM pred),
- "Return a list containing the elements of @var{lst} but with\n"
- "those equal to @var{x} deleted. The returned elements will be\n"
- "in the same order as they were in @var{lst}.\n"
- "\n"
- "Equality is determined by @var{pred}, or @code{equal?} if not\n"
- "given. An equality call is made just once for each element,\n"
- "but the order in which the calls are made on the elements is\n"
- "unspecified.\n"
- "\n"
- "The equality calls are always @code{(pred x elem)}, ie.@: the\n"
- "given @var{x} is first. This means for instance elements\n"
- "greater than 5 can be deleted with @code{(delete 5 lst <)}.\n"
- "\n"
- "@var{lst} may be modified to construct the returned list.")
-#define FUNC_NAME s_scm_srfi1_delete_x
-{
- SCM walk;
- SCM *prev;
-
- if (SCM_UNBNDP (pred))
- return scm_delete_x (x, lst);
-
- SCM_ASSERT (scm_is_true (scm_procedure_p (pred)), pred, SCM_ARG3, FUNC_NAME);
-
- for (prev = &lst, walk = lst;
- scm_is_pair (walk);
- walk = SCM_CDR (walk))
- {
- if (scm_is_true (scm_call_2 (pred, x, SCM_CAR (walk))))
- *prev = SCM_CDR (walk);
- else
- prev = SCM_CDRLOC (walk);
- }
-
- /* demand the input was a proper list */
- SCM_ASSERT_TYPE (SCM_NULL_OR_NIL_P (walk), walk, SCM_ARG2, FUNC_NAME,"list");
- return lst;
-}
-#undef FUNC_NAME
-
-
SCM_DEFINE (scm_srfi1_delete_duplicates, "delete-duplicates", 1, 1, 0,
(SCM lst, SCM pred),
"Return a list containing the elements of @var{lst} but without\n"
diff --git a/libguile/srfi-1.h b/libguile/srfi-1.h
index e2fb2b7c6..62d20cb3b 100644
--- a/libguile/srfi-1.h
+++ b/libguile/srfi-1.h
@@ -29,8 +29,6 @@ SCM_INTERNAL SCM scm_srfi1_append_reverse_x (SCM revhead, SCM
tail);
SCM_INTERNAL SCM scm_srfi1_concatenate (SCM lstlst);
SCM_INTERNAL SCM scm_srfi1_concatenate_x (SCM lstlst);
SCM_INTERNAL SCM scm_srfi1_count (SCM pred, SCM list1, SCM rest);
-SCM_INTERNAL SCM scm_srfi1_delete (SCM x, SCM lst, SCM pred);
-SCM_INTERNAL SCM scm_srfi1_delete_x (SCM x, SCM lst, SCM pred);
SCM_INTERNAL SCM scm_srfi1_delete_duplicates (SCM lst, SCM pred);
SCM_INTERNAL SCM scm_srfi1_delete_duplicates_x (SCM lst, SCM pred);
SCM_INTERNAL SCM scm_srfi1_length_plus (SCM lst);
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm
index 3411b7e3c..8d0a603cd 100644
--- a/module/srfi/srfi-1.scm
+++ b/module/srfi/srfi-1.scm
@@ -982,6 +982,41 @@ CLIST1 ... CLISTN, that satisfies PRED."
(else
(lp (map cdr lists) (+ i 1)))))))
+;;; Deletion
+
+(define* (delete x lst #:optional (pred equal?))
+ "Return a list containing the elements of @var{lst} but with
+those equal to @var{x} deleted. The returned elements will be in the
+same order as they were in @var{lst}.
+
+Equality is determined by @var{pred}, or @code{equal?} if not given. An
+equality call is made just once for each element, but the order in which
+the calls are made on the elements is unspecified.
+
+The equality calls are always @code{(pred x elem)}, ie.@: the given
+@var{x} is first. This means for instance elements greater than 5 can
+be deleted with @code{(delete 5 lst <)}.
+
+@var{lst} is not modified, but the returned list might share a common
+tail with @var{lst}."
+ (remove (lambda (elem) (pred x elem)) lst))
+
+(define* (delete! x lst #:optional (pred equal?))
+ "Return a list containing the elements of @var{lst} but with
+those equal to @var{x} deleted. The returned elements will be in the
+same order as they were in @var{lst}.
+
+Equality is determined by @var{pred}, or @code{equal?} if not given. An
+equality call is made just once for each element, but the order in which
+the calls are made on the elements is unspecified.
+
+The equality calls are always @code{(pred x elem)}, ie.@: the given
+@var{x} is first. This means for instance elements greater than 5 can
+be deleted with @code{(delete 5 lst <)}.
+
+@var{lst} may be modified to construct the returned list."
+ (remove! (lambda (elem) (pred x elem)) lst))
+
;;; Association lists
(define alist-cons acons)
- [Guile-commits] 05/17: srfi-1 concatenate concatenate!: move from C to Scheme, (continued)
- [Guile-commits] 05/17: srfi-1 concatenate concatenate!: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 06/17: srfi-1 append-reverse: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 03/17: srfi-1 remove!: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 12/17: srfi-1 lset-difference!: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 15/17: srfi-1 delete-duplicates: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 17/17: Merge conversion of srfi-1.c to srfi-1.scm, Rob Browning, 2024/07/30
- [Guile-commits] 07/17: srfi-1 append-reverse!: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 08/17: srfi-1 length+: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 09/17: srfi-1 count: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 10/17: srfi-1 partition: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 04/17: srfi-1 delete delete!: move from C to Scheme,
Rob Browning <=
- [Guile-commits] 02/17: srfi-1 remove: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 14/17: srfi-1 delete-duplicates!: move from C to Scheme, Rob Browning, 2024/07/30