Interesting question. We can easily prove that the statement from tutorial is
correct:
Run
proc str: string =
echo "str proc called" "strprocresult"
template logTwice(msg: string) =
#let t = msg #echo t #echo t echo msg echo msg
proc main =
logTwice(str())
main()
$ ./t
str proc called
strprocresult
str proc called
strprocresult
Run
So indeed not a plain string is passed to the template, but the passed
expression is called inside of template. I think for typed or untyped arguments
we may expect that, but maybe not for real data types like string? I guess one
of the Nim devs will write some words of explanations later.