Sujet : Re: processing a sequence
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lisp comp.lang.schemeDate : 31. Aug 2024, 00:10:07
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vatfvt$loks$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
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)))