define-module : examples string-replace-benchmark
. #:export : string-replace-substring string-replace-substring/startindex string-replace-substring/addindex string-replace-substring/naive
; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc")
; 0.010369s real time, 0.010348s run time. 0.000000s spent in GC.
define*
string-replace-substring s substr replacement
. #:optional (start 0) (end (string-length s))
. "Replace every instance of substring in s by replacement."
let : : substr-length : string-length substr
if : zero? substr-length
error "string-replace-substring: empty substr"
let loop
: start start
pieces : list : substring s 0 start
let : : idx : string-contains s substr start end
if idx
loop : + idx substr-length
cons* replacement
substring s start idx
. pieces
string-concatenate-reverse
cons : substring s start
. pieces
; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc")
; 1.112429s real time, 1.083435s run time. 0.780863s spent in GC.
define : string-replace-substring/startindex s substring replacement
. "Replace every instance of substring in s by replacement."
let : : sublen : string-length substring
let replacer
: newstring s
index : string-contains s substring
if : not : equal? index #f
let : : replaced : string-replace newstring replacement index : + index sublen
replacer replaced : string-contains replaced substring index ; only look at parts after index
. newstring
; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc")
; 1.044660s real time, 1.042901s run time. 0.761600s spent in GC.
define : string-replace-substring/addindex s substring replacement
. "Replace every instance of substring in s by replacement."
let : : sublen : string-length substring
let replacer
: newstring s
startindex 0
addindex : string-contains s substring
if : not : equal? addindex #f
let*
: index : + startindex addindex
replaced : string-replace newstring replacement index : + index sublen
newaddindex : string-contains (substring/read-only replaced index) substring
replacer replaced index newaddindex
. newstring
; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc")
; 7.547528s real time, 7.534397s run time. 0.764280s spent in GC.
define : string-replace-substring/naive s substring replacement
. "Replace every instance of substring in s by replacement."
let : : sublen : string-length substring
let replacer
: newstring s
index : string-contains s substring
if : not : equal? index #f
let : : replaced : string-replace newstring replacement index : + index sublen
replacer replaced : string-contains replaced substring
. newstring