This is how I would do it
import macros
macro dsl(nodes) =
result = newStmtList()
for n in nodes:
var value: NimNode
if eqIdent(n[0], "algo1"): value = newLit"Foo"
elif eqIdent(n[0], "algo2"): value = newLit(123)
else: error "Unexpected ident: ", n[0]
for kid in n[1]:
if eqIdent(kid[0], "evaluate"):
let body = kid[1]
result.add quote do:
template value: untyped = `value`
`body`
else:
error "Unexpected ident: ", kid[0]
dsl:
algo1:
evaluate:
echo "[algo1] Evaluation is " & $value
algo2:
evaluate:
echo "[algo2] Evaluation is " & $value
Run