Yeah, go ahead and add it to JIRA.  It's unexpected enough that we
should consider options to improve this.

On Thu, Jan 14, 2010 at 2:18 AM, Steve O'Hara
<[email protected]> wrote:
> I've just come across a little gotcha that has taken a few hours to
> track down which might help other people.
>
> An example;
>
> #macro(myMacro $FieldName)
>    #foreach ($Name in $FieldList)
>        #if ($FieldName=="empty")
>            #set ($tmp=$FieldsFound.put($FieldName,$velocityCount)
>        #end
>    #end
> #end
>
> #foreach ($X in $MyFields)
>    #myMacro("Field$velocityCount")
> #end
>
> All looks OK doesn't it, but........
>
> The problem is one of when arguments are evaluated or in fact to be more
> precise, are not evaluated at all.
> Once you bear that in mind you can see the logical problem above - the
> use of $velocityCount (or indeed any variable) in the argument list of
> myMacro i.e.
>
> #myMacro("Field$velocityCount")
>
> This sort of usage is dangerous because in effect, what is happening is
> that the macro argument literal is being placed within the macro body
> without being evaluated first.
> So, the body of the macro becomes this;
>
>    #foreach ($Name in $FieldList)
>        #if ("Field$velocityCount"=="empty")
>            #set
> ($tmp=$FieldsFound.put("Field$velocityCount",$velocityCount)
>        #end
>    #end
>
> Not what you intended at all and depending on the names of your
> variables, could cause all kinds of mayhem with values coming into scope
> that you hadn't intended.
>
> The workaround is to set a variable before the call to the macro and
> send that instead e.g.
>
> #foreach ($X in $MyFields)
>    #set ($tmp="Field$velocityCount")
>    #myMacro($tmp)
> #end
>
> Nathan: I'm happy to add to JIRA if you think it's a bug - just thought
> I'd share it with the community, might save some heartache for someone.
>
> Steve
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to