; string prefixes
(define (fold-left op base xs)
(if (null? xs)
base
(fold-left op (op base (car xs)) (cdr xs))))
(define (prefix-two eql? x1 x2)
(let loop ((x1 x1) (x2 x2) (zs (list)))
(cond ((or (null? x1) (null? x2))
(reverse zs))
((eql? (car x1) (car x2))
(loop (cdr x1) (cdr x2)
(cons (car x1) zs)))
(else (reverse zs)))))
(define (prefix eql? xss)
(if (null? xss)
(error 'prefix "no input")
(fold-left (lambda (x1 x2)
(prefix-two eql? x1 x2))
(car xss) (cdr xss))))
(define (string-prefix xs)
(list->string
(prefix char=?
(map string->list xs))))
(display (string-prefix '(
"I love cats"
"I love dogs"
"I love my daughters")))
OyBzdHJpbmcgcHJlZml4ZXMKCihkZWZpbmUgKGZvbGQtbGVmdCBvcCBiYXNlIHhzKQogIChpZiAobnVsbD8geHMpCiAgICAgIGJhc2UKICAgICAgKGZvbGQtbGVmdCBvcCAob3AgYmFzZSAoY2FyIHhzKSkgKGNkciB4cykpKSkKCihkZWZpbmUgKHByZWZpeC10d28gZXFsPyB4MSB4MikKICAobGV0IGxvb3AgKCh4MSB4MSkgKHgyIHgyKSAoenMgKGxpc3QpKSkKICAgIChjb25kICgob3IgKG51bGw/IHgxKSAobnVsbD8geDIpKQogICAgICAgICAgICAocmV2ZXJzZSB6cykpCiAgICAgICAgICAoKGVxbD8gKGNhciB4MSkgKGNhciB4MikpCiAgICAgICAgICAgIChsb29wIChjZHIgeDEpIChjZHIgeDIpCiAgICAgICAgICAgICAgICAgIChjb25zIChjYXIgeDEpIHpzKSkpCiAgICAgICAgICAoZWxzZSAocmV2ZXJzZSB6cykpKSkpCgooZGVmaW5lIChwcmVmaXggZXFsPyB4c3MpCiAgKGlmIChudWxsPyB4c3MpCiAgICAgIChlcnJvciAncHJlZml4ICJubyBpbnB1dCIpCiAgICAgIChmb2xkLWxlZnQgKGxhbWJkYSAoeDEgeDIpCiAgICAgICAgICAgICAgICAgICAocHJlZml4LXR3byBlcWw/IHgxIHgyKSkKICAgICAgICAgICAgICAgICAoY2FyIHhzcykgKGNkciB4c3MpKSkpCgooZGVmaW5lIChzdHJpbmctcHJlZml4IHhzKQogIChsaXN0LT5zdHJpbmcKICAgIChwcmVmaXggY2hhcj0/CiAgICAgIChtYXAgc3RyaW5nLT5saXN0IHhzKSkpKQoKKGRpc3BsYXkgKHN0cmluZy1wcmVmaXggJygKICAgICJJIGxvdmUgY2F0cyIKICAgICJJIGxvdmUgZG9ncyIKICAgICJJIGxvdmUgbXkgZGF1Z2h0ZXJzIikpKQ==