[ 
https://issues.apache.org/jira/browse/FREEMARKER-107?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16947132#comment-16947132
 ] 

Pascal Proulx edited comment on FREEMARKER-107 at 10/8/19 7:19 PM:
-------------------------------------------------------------------

Hi Daniel, thanks for getting back to this, I will try it as soon as I can. I 
think that the inlined macro arguments should override the spread_args, such 
that <@m?spread_args(dynArgsAB) c=3 /> would make c=3 override whatever is in 
dynArgsAB. My code emulation workarounds were made the same way, with inline 
parameters always having priority.

Off top of my head I can see no complaints except that hopefully it does not 
add a performance overhead for it to return a "new"/"temporary" macro instance? 
In the sense that I originally pictured this feature to simply call @m and do 
an equivalent of Map.putAll of dynArgsAB into the macro arguments (with the 
inline arguments replacing them after). If there is no performance penalty then 
there is no issue, but I plan to use this quite heavily so I just wanted to 
bring that up. Or maybe some cases could be optimized.

Anyway, thanks

 

 


was (Author: pplx):
Hi Daniel, thanks for getting back to this, I will try it as soon as I can. I 
think that the inlined macro arguments should override the spread_args, such 
that <@m?spread_args(dynArgsAB) c=3 /> would make c=3 override whatever is in 
dynArgsAB. My code emulation workarounds were made the same way, with inline 
parameters having priority.

Off top of my head I can see no complaints except that hopefully it does not 
add a performance overhead for it to return a "new"/"temporary" macro instance? 
In the sense that I originally pictured this feature to simply call @m and do 
an equivalent of Map.putAll of dynArgsAB into the macro arguments (with the 
inline arguments replacing them after). If there is no performance penalty then 
there is no issue, but I plan to use this quite heavily so I just wanted to 
bring that up. Or maybe some cases could be optimized.

Anyway, thanks

 

 

> Hash expansion to macro arguments (Python **kwargs style)
> ---------------------------------------------------------
>
>                 Key: FREEMARKER-107
>                 URL: https://issues.apache.org/jira/browse/FREEMARKER-107
>             Project: Apache Freemarker
>          Issue Type: New Feature
>          Components: engine
>    Affects Versions: 2.3.28
>            Reporter: Pascal Proulx
>            Priority: Major
>
> Hello,
> We heavily rely on Freemarker macros to build a helper template API, but have 
> had to make large workarounds for passing contents of hashes as macro 
> arguments, for several years. (In truth I should have made this ticket much 
> sooner!)
> It would help greatly simplify our work to have hash expansion to macro 
> arguments, like this:
> {code:java}
> <#macro myMacro arg1 arg2 arg3="value3">...</#macro>
> <#assign myHash = {"arg1":"value1", "arg2":"value2"}>
> <@myMacro **myHash/><#-- the hash contents are passed as parameters, instead 
> of the hash itself -->
> {code}
> This exists in Python:
> {code:java}
> def test_var_args_call(arg1, arg2, arg3):
>     pass
> kwargs = {"arg3": 3, "arg2": "two"}
> test_var_args_call(1, **kwargs)
> {code}
> Essentially the hash contents fill in any arguments not explicitly specified.
> For the case where arguments are specified in addition to the hash, you may 
> need to decide on a good syntax, e.g.:
> {code:java}
> <@myMacro arg1="value1" **myHash/>{code}
> This example doesn't have much precedent in freemarker syntax but is fairly 
> understandable.
> Although we don't need it nearly as much, the same could be done with lists 
> and function arguments:
> {code:java}
> <#function myFunc arg1 arg2>...</#function>
> <#assign myList = ["val1", "val2"]>
> ${myFunc(*myList)}
> <#assign myList = ["val2"]>
> ${myFunc("val1", *myList)}
> {code}
> Again similar to Python:
> {code:java}
> def test_var_args_call(arg1, arg2, arg3):
>     pass
> args = ("two", 3)
> test_var_args_call(1, *args)
> {code}
> You might want this for consistency, although in practice the hash expansion 
> will be many times more useful to us.
> If there's a lack a manpower I could try to see what I can do digging into 
> the source, but wanted to bring this up for discussion first. It doesn't 
> appear hard to implement to dump a hash into the macro args map, but there is 
> defining the syntax.
> We use Freemarker 2.3.28 at the moment.
> Thank you



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to