> What's the heck!
The manual is not completely clear AFAIU, but the mistake is very likely that
your code expects overloading to work with templates as it does with
procedures, which it doesn't. The first `options` template is an immediate one
and doesn't overload with the second (see
[https://nim-lang.org/docs/manual.html#templates-typed-vs-untyped-parameters)](https://nim-lang.org/docs/manual.html#templates-typed-vs-untyped-parameters\)).
The code can be fixed by giving the first `options` template a typed dummy
`status` parameter, which makes it non-immediate so that overloading works
again.
A more elegant solution is to take the first `options` template out of the
overloading hierarchy like this:
import macros
template dsl(dslBody: untyped): untyped =
block:
macro options(args: varargs[untyped]): untyped =
template tpl(postFix: untyped; args: varargs[untyped]) =
`options postFix`(args)
let postFix = if nnkStmtList == args[0].kind:
"UT".ident
else:
"T".ident
result = getAst(tpl(postFix, args))
template optionsUT(optionsBody: untyped): untyped =
block:
template foo(fooBody: untyped): untyped =
echo "Enter foo"
fooBody
echo "Leave foo"
echo "Enter options"
optionsBody
echo "Leave options"
template optionsT(status: string; optionsBody: untyped): untyped =
block:
echo "Enter options with string " & status
options(optionsBody)
echo "Leave options with string " & status
# add other `optionsT` templates with `status: <sometype>` here..
echo "Enter dsl"
dslBody
echo "Leave dsl"
expandMacros:
dsl:
options:
echo "Youpi!"
foo:
echo "1000 $!!!"
options "Oops!":
echo "I failed"
foo:
echo "1000 $!!!"
Run
(Term rewriting macros might be able to do this in a more compact way, but they
are experimental.)
So maybe we add these to your list:
1. Read all of the manual and experiment where it is not 100% clear.
2. Believe @Araq when he tells you to look at macros before trying to
overstretch the power of templates.
;-)