Ah, in that case, you can use an inline closure iterator with no name:
type
Melon = object
template pairs*(m: Melon): tuple[key: int, val: int] =
let iter = iterator(melon: Melon): tuple[key: int, val: int] =
for i in a .. 10:
yield (key: i, val: i * i)
iter(m)
block:
let a = 2
let m = Melon()
for k, v in m:
echo "k=", k, "; v=", v
Run
The `toto.nim(10, 13) Error: cannot use symbol of kind 'let' as a 'param'`
error you were experiencing was because you used `m` as the name for the
template argument AND for the `iterator` argument. Templates will expand
argument names to something like `m`gensym4552018`, so you need to name the
argument of your inner iterator something different. In the code above, I
simply renamed it to `melon`.
You could also do it without a closure iterator like so:
type
Melon = object
template pairs*(m: Melon): tuple[key: int, val: int] =
(iterator(melon: Melon): tuple[key: int, val: int] =
for i in a .. 10:
yield (key: i, val: i * i))(m)
block:
let a = 2
let m = Melon()
for k, v in m:
echo "k=", k, "; v=", v
Run
But IMO, looks a bit messier.