[racket] I am trying to make little human like text searching program
hello
I am trying to make little human like text searching program
but there's bug that I can't catch for many hours
the bug is
when text.txt file contains
explorer
and when I am trying to find
exp
then error arise
when the text.txt contains
explorers
and the time I trying to search
expl
the error
list-ref: index 9 too large for list: (#\e #\x #\p #\l #\o #\r #\e #\r #\s)
is arise on
(equal? last-char (list-ref data (+ index len -1))))
but the wierd thing is that
when the text.txt file contains
2explorers
and when I am trying to find
2explorer
no error arise
but
finding 2explorers returns 0 Found
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#lang scheme/gui
;it is list operation though parameter is str
;as little like human, check first and last character first
(define (search str)
(set! count 0)
(define len (length str))
(define data-len (length data))
(when (and (not (= 0 len)) (>= data-len len))
(define first-char (first str))
(define last-char (last str))
;is it exactly same?
(define (exact? str len index)
(if (equal? str (drop (take data (+ index len)) index))
#t
#f))
;if first and last character is correct, then compare whole
searching string, if not, skip
(define (loop [index 0])
(when (> data-len index)
(if (and (equal? first-char (list-ref data index))
(display index)
(newline)
(display len)
(newline)
(display "==================")
(equal? last-char (list-ref data (+ index len -1))))
(when (exact? str len index)
(set! count (+ count 1))
(loop (+ index len)))
(loop (+ index 1)))))
(loop))
(send msg set-label (format "~a Found" count)))
;counting number
(define count 0)
;define path
(define path (get-file))
;convert path to port
(define port (open-input-file path))
(define data '())
;load the file to list data
(define (loop [line (read-line port)])
(when (not (eof-object? line))
(set! data (append data (string->list line)))
(loop)))
(loop)
;search every time the text changes
(define (cb-txt t e) (search (string->list (send t get-value))))
;define frame
(define f (new frame% (label "text search") (min-width 300)))
;define text field
(define txt (new text-field% (label "type here") (parent f) (callback
(λ (t e) (cb-txt t e)))))
;define message
(define msg (new message% (label "0 Found ") (parent f)))
;show
(send f show #t)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;