Lookup rules for template parameters

A parameter p in a template is even substituted in the expression x.p. Thus template arguments can be used as field names and a global symbol can be shadowed by the same argument name even when fully qualified:

  1. # module 'm'
  2. type
  3. Lev = enum
  4. levA, levB
  5. var abclev = levB
  6. template tstLev(abclev: Lev) =
  7. echo abclev, " ", m.abclev
  8. tstLev(levA)
  9. # produces: 'levA levA'

But the global symbol can properly be captured by a bind statement:

  1. # module 'm'
  2. type
  3. Lev = enum
  4. levA, levB
  5. var abclev = levB
  6. template tstLev(abclev: Lev) =
  7. bind m.abclev
  8. echo abclev, " ", m.abclev
  9. tstLev(levA)
  10. # produces: 'levA levB'