For example, the following code doesn't compile:
    
    
    template t2() =
       template t1() = res.add "hello"
       
       var res = ""
       t1()
       echo res
    
    proc p1() =
       t2()
    
    when isMainModule:
       p1()
    
    
    Run

The compiler out:
    
    
    :\Tool\Nim\tmp\a59.nim(9, 6) template/generic instantiation of `t2` from 
here
    D:\Tool\Nim\tmp\a59.nim(5, 6) template/generic instantiation of `t1` from 
here
    D:\Tool\Nim\tmp\a59.nim(2, 20) Error: undeclared identifier: 'res'
    
    
    Run

One way fix this is use `var res {.inject.} = ""`.

It is very annoying, when we chang the `template t2` to `proc t2`, the code is 
fine, because the t2 will be expanded in proc t2 context. When an template call 
another template, we have to pass all variable as parameter to caller template.

Reply via email to