About templates, they're like C macros (but hygienic), a simple way to do metaprogramming without manually building syntax like in Nim macros. They're not like procs in that they aren't called at runtime, they simply exist during compile time and transform AST given to its parameters. An untyped parameter is any raw AST that hasn't been type checked yet, and a typed parameter has been type checked and gone through AST transformation. If you name a template parameter like x: int, x will be type checked and have the int type. If you want a value to use in a template inside when expressions or other static checks instead of an expression like x: int would give, you can use static[int], but it's not entirely stable yet.