<#local name=value>
<#local name1=value1 name2=value2 ... nameN=valueN>
<#local name>
  capture this


  • name: the name of the local object in the root. It is not an expression. However, it can be written as a string literal, which is useful if the variable name contains reserved characters, for example <#local "foo-bar" = 1>. Note that this string literal does not expand interpolations (as "${foo}").
  • =: Assignment operator, which can also be one of the shorthand assignment operators (++, +=, etc.), just like with the assign directive,
  • value: the value to store. Expression.


It is similar to assign directive, but it creates or replaces local variables. This only works inside macro definitions and function definitions.

For more information about variables, read this: Template Author's Guide/Miscellaneous/Defining variables in the template


A frequent mistake is trying to use assign to change a local variable like: <#macro m><#local x = 1>${x}<#assign x = 2>${x}</#macro>. This prints 11, not 12, because assign creates/replaces the x of the namespace that the template belongs to, and doesn't change the x local variable. Local variables should be always set with the local directive, not just for the fist time.