mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-15 16:20:17 +02:00
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!.
This commit is contained in:
parent
17281519df
commit
3cb6309f62
3 changed files with 22 additions and 34 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue