(module kmp (main main) (import kmp-table)) (define (main args) (print (kmp:KMP (cadr args) (caddr args)))) (define (kmp:KMP Word Text) (let ((Tpref (kmp:table Word)) (L-texte (string-length Text)) (LastCharPos (- (string-length Word) 1))) (let loop ((m 0) ;; match (i 0)) ;; index (cond ((>= (+ m i) L-texte) -1) ((char=? (string-ref Text (+ m i)) (string-ref Word i)) (if (= i LastCharPos) m (loop m (+ i 1)))) (else (loop (- (+ m i) (vector-ref Tpref i)) (if (> i 0) (vector-ref Tpref i) i))) ) ) ))