diff options
author | Rob Browning <rlb@defaultvalue.org> | 2024-07-17 20:30:20 -0500 |
---|---|---|
committer | Rob Browning <rlb@defaultvalue.org> | 2024-07-30 19:28:37 -0500 |
commit | 3cb6309f623ad9ab242a2397cac3ede2ee289f9e (patch) | |
tree | 2ead8f03b30c909bbe87d5eb4282cb06a1e44ead /module/srfi/srfi-1.scm | |
parent | 17281519dfdab28b4d969fc8bd1bc9de7a2138da (diff) | |
download | guile-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.scm | 22 |
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) |