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.

Reply via email to