XPost: comp.lang.scheme
joswig@.... wrote:
I am trying to process a sequence like:
(0 1 2 3 0 1 2 3 0 1 2 3)
and produce:
((0 1 2 3)(0 1 2 3)(0 1 2 3))
i.e. create sub-sequences beginning whenever the value decreases.
Gauche Scheme
(monotonic-slices '(0 1 2 3 0 1 2 3 0 1 2 3) + >)
===>
((0 1 2 3) (0 1 2 3) (0 1 2 3))
Given:
(define (each-mono-slice func LST :optional (KEY-FUNC values) (CMP equal?))
(let ((RESULT '()) (TMP '()) (OLD-KEY 0) (NEW-KEY 0))
(dolist (X LST)
(set! NEW-KEY (KEY-FUNC X))
(cond ((null? TMP) (push! TMP X))
((CMP NEW-KEY OLD-KEY)
(push! TMP X))
(#t (func (reverse TMP)) (set! TMP (list X))))
(set! OLD-KEY NEW-KEY))
(unless (null? TMP) (func (reverse TMP)))
(reverse RESULT)))
(define (monotonic-slices LST :optional (KEY-FUNC values) (CMP equal?))
(let ((result '()))
(each-mono-slice (lambda(xs) (push! result xs)) LST KEY-FUNC CMP)
(reverse result)))
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)