summaryrefslogtreecommitdiff
path: root/module/srfi/srfi-1.scm
diff options
context:
space:
mode:
authorRob Browning <rlb@defaultvalue.org>2024-07-17 20:30:20 -0500
committerRob Browning <rlb@defaultvalue.org>2024-07-30 19:28:37 -0500
commit3cb6309f623ad9ab242a2397cac3ede2ee289f9e (patch)
tree2ead8f03b30c909bbe87d5eb4282cb06a1e44ead /module/srfi/srfi-1.scm
parent17281519dfdab28b4d969fc8bd1bc9de7a2138da (diff)
downloadguile-3cb6309f623ad9ab242a2397cac3ede2ee289f9e.tar.gz
srfi-1 append-reverse!: move from C to Scheme
* libguile/srfi-1.c (scm_srfi1_append_reverse_x): delete. * libguile/srfi-1.h (scm_srfi1_append_reverse_x): delete. * module/srfi/srfi-1.scm: add append-reverse!.
Diffstat (limited to 'module/srfi/srfi-1.scm')
-rw-r--r--module/srfi/srfi-1.scm22
1 files changed, 22 insertions, 0 deletions
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm
index 689d77812..f44b32909 100644
--- a/module/srfi/srfi-1.scm
+++ b/module/srfi/srfi-1.scm
@@ -481,6 +481,28 @@ result. This is equivalent to @code{(append (reverse @var{rev-head})
(wrong-type-arg 'append-reverse rev-head))
result))))
+(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! (list 1 2 3) '(4 5 6)) @result{} (3 2 1 4 5 6)
+@end example
+
+@var{rev-head} may be modified in order to produce the result."
+ (let lp ((rh rev-head)
+ (result tail))
+ (if (pair? rh)
+ (let ((next rh)
+ (rh (cdr rh)))
+ (set-cdr! next result)
+ (lp rh next))
+ (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)