All pastes #1428 Raw Edit

Anonymous

public text v1 · immutable
#1428 ·published 2004-10-13 05:19 UTC
rendered paste body
(define call/cc call-with-current-continuation)
(define 1+ (lambda (n) (+ 1 n)))
(define last-cons (lambda (l) (list-tail l (- (length l) 1))))
(define last (lambda (l) (list-ref l (- (length l) 1))))

(define string-lexer
  (lambda (s tokens)
    (letrec
        ((get-next
          (lambda (i previous-match result)
            (let
                ((match
                  (call/cc
                   (lambda (return)
                     (map (lambda (token)
                            (if (member (string-ref s i) (string->list token))
                                (return token)))
                          tokens)
                     (return "")))))
              (if (< (1+ i) (string-length s))
                  (get-next (1+ i)
                            match
                            (if (string=? match previous-match)
                                (begin
                                  (set-car! (last-cons result)
                                            (string-append (last result)
                                                           (string (string-ref s i))))
                                  result)
                                (append result (cons (string (string-ref s i)) '()))))
                  result)))))
      (get-next 0 "" '()))))

; this function leaves the last letter off, like so:
;
; > (string-lexer "huk asdf    t huk" '("huk" "fdsa"))
; ("huk" " " "asdf" "    t " "hu")
;
; i cannot figure out why, if i make the conditional
; (< i (string-length s)) it makes an index out of range
; error. also tell me the stupid things i am doing in
; this code :|