(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)) (Ltext (string-length Text)) (LastCharPos (- (string-length Word) 1))) (let loop ((i 0) (j 0)) (cond ((>= (+ i j) Ltext) -1) ((char=? (string-ref Text (+ i j)) (string-ref Word j)) (if (= j LastCharPos) i (loop i (+ j 1)))) (else (loop (- (+ i j) (vector-ref Tpref j)) (if (> j 0) (vector-ref Tpref j) j))) ) ) ))