guile-commits
[Top][All Lists]
Advanced

[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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]