velocity-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergiu Dumitriu <ser...@xwiki.com>
Subject Re: More 1.7 BC issues (porting from 1.5)
Date Fri, 04 May 2012 02:49:14 GMT
On 05/03/2012 03:20 PM, Nathan Bubna wrote:
> Ah, it was Sergiu, not Byron.  Here's the relevant discussion:
>
> https://issues.apache.org/jira/browse/VELOCITY-681

Yep, me.

http://wiki.apache.org/velocity/MacroEvaluationStrategy lists the 
different ways that Velocity treats macro parameters, depending on how 
they're used, what their value is, and what kind of expressions are 
actually used when calling the macro.

I'd say that your example falls in the "call by macro expansion" 
example, which is how true "macros" are supposed to be evaluated, and 
this is what you'd get from a C #define macro as well. You're making the 
same mistake I often do, and think of Velocity as a kind of scripted 
Java, and of macros as a kind of Java functions. Under these 
assumptions, indeed one would expect "call by value" behavior.

Velocity 1.7 moved closer to the "call by macro expansion" model, since 
it is a templating engine, and not a real programming language, even if 
some of its users do use it like one.

Bottom line, I wouldn't call this a regression that needs to be fixed, 
but a bugfix that unfortunately broke compatibility for the few users 
that actually relied on the bug. The proper solution is to bite the 
bullet and "fix" all your macros.

> On Thu, May 3, 2012 at 12:16 PM, Nathan Bubna<nbubna@gmail.com>  wrote:
>> Ok, for my sanity, is this an accurate rewrite?
>>
>> #macro( inner $arg )
>>   #set($ref = '')$arg
>> #end
>> #macro( outer )
>>   #foreach( $ref in ['foo','bar','yok','dar'] )
>>     #inner( $ref )
>>   #end
>> #end
>> #outer()
>>
>> Do you get the same behavior in both with this?
>>
>> #macro( inner $arg )
>>   #set($ref = '')$arg
>> #end
>> #foreach( $ref in ['foo','bar','yok','dar'] )
>>   #inner( $ref )
>> #end
>>
>> Or is it only when the macros are nested?
>> Also, do you have localscope on for the macros?
>>
>> I know changes were made in the pass-by-name behavior between 1.5 and
>> the trunk (2.0-SNAPSHOT), but my memory is failing as to the
>> chronology of them.  What i do recall (possibly incorrectly), makes me
>> think this should have been reversed; blank in the older version,
>> instead of the newer.  I thought we stopped proxying #set calls on
>> macro args, because while that was arguably a correct way to do
>> pass-by-name, it was deemed surprising and not worth the
>> implementation/performance costs.  I seem to recall arguing with
>> someone about this, maybe Byron?  Well, i'm confused.   I also haven't
>> the time to fire up Velocity environment right now on this machine to
>> test it.  Perhaps someone else can step in.
>>
>> On Thu, May 3, 2012 at 11:51 AM, Boris Partensky
>> <boris.partensky@gmail.com>  wrote:
>>> Not seeing any errors in log. Corrected to 2 single quotes. Same
>>> behavior. I was hoping that $input in each iteration will not be empty
>>> string, but rather 'foo', 'bar' etc (that's the way 1.5 behaves). Why
>>> would setting a value of $type in parent (foreach) scope would affect
>>> the value of the local $input argument?
>>>
>>> String template = "#set($global_types=['foo', 'bar', 'yok',
>>> 'dar'])#macro( showBox $input)#set($type = '')$input#end"+
>>>                 "#macro(showBoxes $types)#foreach($type in
>>> $types)#showBox($type)#end#end#showBoxes($global_types)";
>>>
>>>
>>> On Thu, May 3, 2012 at 2:33 PM, Nathan Bubna<nbubna@gmail.com>  wrote:
>>>> Anything in the log?  #set($type = \"\") is not valid syntax, i think.
>>>>   I'm not even sure what value you want $type to have.  Two double
>>>> quotes or an empty string?
>>>>
>>>> On Thu, May 3, 2012 at 11:17 AM, Boris Partensky
>>>> <boris.partensky@gmail.com>  wrote:
>>>>> Hi, I have this use case which involves 2 nested macros and a foreach.
>>>>> I am trying to understand why this template evaluates to empty string
>>>>> on 1.7, and to "foobaryokdar" - on 1.5.
>>>>>
>>>>>
>>>>> String template = "#set($global_types=['foo', 'bar', 'yok',
>>>>> 'dar'])#macro( showBox $input)#set($type = \"\")$input#end"+
>>>>>                 "#macro(showBoxes $types)#foreach($type in
>>>>> $types)#showBox($type)#end#end#showBoxes($global_types)";
>>>>>


-- 
Sergiu Dumitriu
http://purl.org/net/sergiu/

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
For additional commands, e-mail: user-help@velocity.apache.org


Mime
View raw message