; count all matches
(define (count-all-matches needle haystack)
(let loop ((needle (string->list needle))
(haystack (string->list haystack)))
(cond ((null? needle) 1)
((null? haystack) 0)
((char=? (car needle) (car haystack))
(+ (loop (cdr needle) (cdr haystack))
(loop needle (cdr haystack))))
(else (loop needle (cdr haystack))))))
(display (count-all-matches "cat" "catapult")) (newline)
(display (count-all-matches "cap" "catapult")) (newline)
(display (count-all-matches "cut" "catapult")) (newline)
(display (count-all-matches "cup" "catapult")) (newline)
OyBjb3VudCBhbGwgbWF0Y2hlcwoKKGRlZmluZSAoY291bnQtYWxsLW1hdGNoZXMgbmVlZGxlIGhheXN0YWNrKQogIChsZXQgbG9vcCAoKG5lZWRsZSAoc3RyaW5nLT5saXN0IG5lZWRsZSkpCiAgICAgICAgICAgICAoaGF5c3RhY2sgKHN0cmluZy0+bGlzdCBoYXlzdGFjaykpKQogICAgKGNvbmQgKChudWxsPyBuZWVkbGUpIDEpCiAgICAgICAgICAoKG51bGw/IGhheXN0YWNrKSAwKQogICAgICAgICAgKChjaGFyPT8gKGNhciBuZWVkbGUpIChjYXIgaGF5c3RhY2spKQogICAgICAgICAgICAoKyAobG9vcCAoY2RyIG5lZWRsZSkgKGNkciBoYXlzdGFjaykpCiAgICAgICAgICAgICAgIChsb29wIG5lZWRsZSAoY2RyIGhheXN0YWNrKSkpKQogICAgICAgICAgKGVsc2UgKGxvb3AgbmVlZGxlIChjZHIgaGF5c3RhY2spKSkpKSkKCihkaXNwbGF5IChjb3VudC1hbGwtbWF0Y2hlcyAiY2F0IiAiY2F0YXB1bHQiKSkgKG5ld2xpbmUpCihkaXNwbGF5IChjb3VudC1hbGwtbWF0Y2hlcyAiY2FwIiAiY2F0YXB1bHQiKSkgKG5ld2xpbmUpCihkaXNwbGF5IChjb3VudC1hbGwtbWF0Y2hlcyAiY3V0IiAiY2F0YXB1bHQiKSkgKG5ld2xpbmUpCihkaXNwbGF5IChjb3VudC1hbGwtbWF0Y2hlcyAiY3VwIiAiY2F0YXB1bHQiKSkgKG5ld2xpbmUp