Changeset 13284 in project


Ignore:
Timestamp:
02/13/09 04:59:35 (11 years ago)
Author:
Ivan Raikov
Message:

Procedure longest rewritten to use fold.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/3/lexgen/trunk/lexgen.scm

    r13244 r13284  
    154154(define (longest streams)
    155155  (match-let (((count stream)
    156                (let loop ((lst streams))
    157                  (if (null? lst) (list 0 `(() ()))
    158                      (match lst
    159                             (((eaten food) . rest)
    160                              (match-let (((max stream) (loop rest)))
    161                                         (let ((l (length eaten)))
    162                                           (if (< l max) (list max stream)
    163                                               (list l (list (reverse eaten) food))))))
    164                             (else (error 'longest "invalid stream" lst)))))))
     156               (fold (lambda (stream max)
     157                       (match (list stream max)
     158                              (((eaten food) (max-count max-stream))
     159                               (if (< max-count (length eaten))
     160                                   (list (length eaten) stream) max))
     161                              (else (error 'longest "invalid stream" stream))))
     162                     (list 0 `(() ()))
     163                     streams)))
    165164             (and (positive? count) stream)))
    166165
     
    174173
    175174(define (lex pat s)
    176   (let ((stream (->char-list s)))
    177     (longest (pat `((() ,stream))))))
     175  (let* ((stream (->char-list s))
     176         (res    (longest (pat `((() ,stream))))))
     177    (and res (list (reverse (first res)) (second res)))))
Note: See TracChangeset for help on using the changeset viewer.