• Re: processing a sequence

    From B. Pym@21:1/5 to joswig@.... on Fri Aug 30 22:10:07 2024
    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)