[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 06/17: srfi-1 append-reverse: move from C to Scheme
From: |
Rob Browning |
Subject: |
[Guile-commits] 06/17: srfi-1 append-reverse: 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 17281519dfdab28b4d969fc8bd1bc9de7a2138da
Author: Rob Browning <rlb@defaultvalue.org>
AuthorDate: Wed Jul 17 02:55:16 2024 -0500
srfi-1 append-reverse: move from C to Scheme
* libguile/srfi-1.c (scm_srfi1_append_reverse): delete.
* libguile/srfi-1.h (scm_srfi1_append_reverse): delete.
* module/srfi/srfi-1.scm: add append-reverse.
---
libguile/srfi-1.c | 25 -------------------------
libguile/srfi-1.h | 1 -
module/srfi/srfi-1.scm | 17 +++++++++++++++++
3 files changed, 17 insertions(+), 26 deletions(-)
diff --git a/libguile/srfi-1.c b/libguile/srfi-1.c
index d75e77088..ab3492422 100644
--- a/libguile/srfi-1.c
+++ b/libguile/srfi-1.c
@@ -86,31 +86,6 @@ list_copy_part (SCM lst, int count, SCM *dst)
#undef FUNC_NAME
-SCM_DEFINE (scm_srfi1_append_reverse, "append-reverse", 2, 0, 0,
- (SCM revhead, SCM tail),
- "Reverse @var{rev-head}, append @var{tail} to it, and return the\n"
- "result. This is equivalent to @code{(append (reverse\n"
- "@var{rev-head}) @var{tail})}, but its implementation is more\n"
- "efficient.\n"
- "\n"
- "@example\n"
- "(append-reverse '(1 2 3) '(4 5 6)) @result{} (3 2 1 4 5 6)\n"
- "@end example")
-#define FUNC_NAME s_scm_srfi1_append_reverse
-{
- while (scm_is_pair (revhead))
- {
- /* copy first element of revhead onto front of tail */
- tail = scm_cons (SCM_CAR (revhead), tail);
- revhead = SCM_CDR (revhead);
- }
- SCM_ASSERT_TYPE (SCM_NULL_OR_NIL_P (revhead), revhead, SCM_ARG1, FUNC_NAME,
- "list");
- return tail;
-}
-#undef FUNC_NAME
-
-
SCM_DEFINE (scm_srfi1_append_reverse_x, "append-reverse!", 2, 0, 0,
(SCM revhead, SCM tail),
"Reverse @var{rev-head}, append @var{tail} to it, and return the\n"
diff --git a/libguile/srfi-1.h b/libguile/srfi-1.h
index c5844cf8f..779e216ec 100644
--- a/libguile/srfi-1.h
+++ b/libguile/srfi-1.h
@@ -24,7 +24,6 @@
#include "libguile/scm.h"
-SCM_INTERNAL SCM scm_srfi1_append_reverse (SCM revhead, SCM tail);
SCM_INTERNAL SCM scm_srfi1_append_reverse_x (SCM revhead, SCM tail);
SCM_INTERNAL SCM scm_srfi1_count (SCM pred, SCM list1, SCM rest);
SCM_INTERNAL SCM scm_srfi1_delete_duplicates (SCM lst, SCM pred);
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm
index a5308b403..689d77812 100644
--- a/module/srfi/srfi-1.scm
+++ b/module/srfi/srfi-1.scm
@@ -464,6 +464,23 @@ of arguments a function takes, which the @code{apply}
might exceed. In
Guile there is no such limit."
(apply append! lists))
+(define (append-reverse rev-head tail)
+ "Reverse @var{rev-head}, append @var{tail} to it, and return the
+result. This is equivalent to @code{(append (reverse @var{rev-head})
+@var{tail})}, but its implementation is more efficient.
+
+@example
+(append-reverse '(1 2 3) '(4 5 6)) @result{} (3 2 1 4 5 6)
+@end example"
+ (let lp ((rh rev-head)
+ (result tail))
+ (if (pair? rh)
+ (lp (cdr rh) (cons (car rh) result))
+ (begin
+ (unless (null? rh)
+ (wrong-type-arg 'append-reverse rev-head))
+ result))))
+
(define (zip clist1 . rest)
(let lp ((l (cons clist1 rest)) (acc '()))
(if (any null? l)
- [Guile-commits] branch main updated (6bd70136d -> bce91cebe), Rob Browning, 2024/07/30
- [Guile-commits] 11/17: srfi-1 partition!: move from C to Scheme, Rob Browning, 2024/07/30
- [Guile-commits] 13/17: srfi-1 lset-difference: use remove, Rob Browning, 2024/07/30
- [Guile-commits] 16/17: Drop libguile srfi-1, Rob Browning, 2024/07/30
- [Guile-commits] 01/17: srfi-1 list-copy: move from C to Scheme, Rob Browning, 2024/07/30
- [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 <=
- [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, 2024/07/30
- [Guile-commits] 02/17: srfi-1 remove: move from C to Scheme, Rob Browning, 2024/07/30