diff options
author | Alex Shinn <alexshinn@gmail.com> | 2024-01-10 23:45:28 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-10 23:45:28 +0900 |
commit | 97a04bd2fc68bc153008971f7656875b2861ad98 (patch) | |
tree | def51825ff20a1e300c787e741bae1f7284c79cc | |
parent | a67e75926dcbf7ccbdfe588d7ad86ca9761a8207 (diff) | |
parent | 967b888d8c4671930117a6351129bc3186a2bdff (diff) |
Merge pull request #946 from ekaitz-zarraga/faster-concatenate!
Reduce iterations in concatenate!
-rw-r--r-- | lib/srfi/1/misc.scm | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/srfi/1/misc.scm b/lib/srfi/1/misc.scm index 843ed19d..e5a7f59e 100644 --- a/lib/srfi/1/misc.scm +++ b/lib/srfi/1/misc.scm @@ -15,13 +15,16 @@ (define (concatenate! lists) (if (null? lists) '() - (fold (lambda (el acc) - (cond - ((null? acc) el) - ((null? el) acc) - (else (begin (set-cdr! (last-pair acc) el) acc)))) - (car lists) - (cdr lists)))) + (let loop ((acc '()) + (prev '()) + (rem lists)) + (cond + ((null? rem) acc) + ((null? acc) (let ((cur (car rem))) (loop cur cur (cdr rem)))) + ((null? (car rem)) (loop acc prev (cdr rem))) + (else (let ((cur (car rem))) + (set-cdr! (last-pair prev) cur) + (loop acc cur (cdr rem)))))))) (define (append-reverse rev tail) (if (null? rev) tail (append-reverse (cdr rev) (cons (car rev) tail)))) |