mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-30 00:40:20 +02:00
(count1, take-while): Rewrite to be tail-recursive.
Thanks to Panagiotis Vossos.
This commit is contained in:
parent
c2b8405784
commit
cd246d3d16
1 changed files with 17 additions and 11 deletions
|
@ -524,11 +524,12 @@
|
||||||
(lp (map1 cdr lists))))))))
|
(lp (map1 cdr lists))))))))
|
||||||
|
|
||||||
(define (count1 pred clist)
|
(define (count1 pred clist)
|
||||||
(if (null? clist)
|
(let lp ((result 0) (rest clist))
|
||||||
0
|
(if (null? rest)
|
||||||
(if (pred (car clist))
|
result
|
||||||
(+ 1 (count1 pred (cdr clist)))
|
(if (pred (car rest))
|
||||||
(count1 pred (cdr clist)))))
|
(lp (+ 1 result) (cdr rest))
|
||||||
|
(lp result (cdr rest))))))
|
||||||
|
|
||||||
;;; Fold, unfold & map
|
;;; Fold, unfold & map
|
||||||
|
|
||||||
|
@ -785,12 +786,17 @@
|
||||||
clist
|
clist
|
||||||
(find-tail pred (cdr clist)))))
|
(find-tail pred (cdr clist)))))
|
||||||
|
|
||||||
(define (take-while pred clist)
|
(define (take-while pred ls)
|
||||||
(if (null? clist)
|
(cond ((null? ls) '())
|
||||||
'()
|
((not (pred (car ls))) '())
|
||||||
(if (pred (car clist))
|
(else
|
||||||
(cons (car clist) (take-while pred (cdr clist)))
|
(let ((result (list (car ls))))
|
||||||
'())))
|
(let lp ((ls (cdr ls)) (p result))
|
||||||
|
(cond ((null? ls) result)
|
||||||
|
((not (pred (car ls))) result)
|
||||||
|
(else
|
||||||
|
(set-cdr! p (list (car ls)))
|
||||||
|
(lp (cdr ls) (cdr p)))))))))
|
||||||
|
|
||||||
(define (take-while! pred clist)
|
(define (take-while! pred clist)
|
||||||
(take-while pred clist)) ; XXX:optimize
|
(take-while pred clist)) ; XXX:optimize
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue