Hi,
Given two templates splitre() and splitnre() which are almost identical
import strutils, re, nre
proc makeDiscardable[T](a: T): T {.discardable.} = a
template splitre*(source: string, dest: untyped, match: string): int =
when compiles(dest):
dest = re.split(source, re.re("(?s)" & match, {}))
else:
var dest = re.split(source, re.re("(?s)" & match, {}))
if dest[0] == source: # no match
delete(dest, 0)
makeDiscardable(0)
else:
makeDiscardable(dest.len)
template splitnre*(source: string, dest: untyped, match: string): int =
when compiles(dest):
dest = nre.split(source, nre.re("(?s)" & match))
else:
var dest = nre.split(source, nre.re("(?s)" & match))
if dest[0] == source: # no match
delete(dest, 0)
makeDiscardable(0)
else:
makeDiscardable(dest.len)
echo $splitre( "the is is", arr, "is")
echo $splitnre("the is is", arr, "is")
They both work (the output is "2 2"), but splitre() generates a message at compile
template/generic instantiation from here
"Here" being the point of call of the template (ie. echo $splitre).
I can't figure out why one generates the message and not the other, since the only difference is re vs nre