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

Dániel Dékány edited comment on FREEMARKER-107 at 10/29/19 10:36 PM:
---------------------------------------------------------------------

What IDE are you using?

The important thing to realize is that the thing after the {{<@}} is just a 
generic expression, and not a directive name. But in the most frequent use case 
that expression is like {{someHash.someVariable}}, and so that special case is 
comprehended by the parser, and then it checks in the {{</@...>}} if the name 
matches, helping the readability of the template. But consider for example 
{{<@(s1 + s2)?interpret>...</@>}}. What would be the meaningful name in the 
end-tag? But, I do know what {{?spread_args(...) does}}, and so we know that 
while it returns a new, anonymous directive, it's kind of the same directive 
than it what's was applied on. So I could add a special case for 
{{?spread_args(...)}}, but not in general for {{?}}, because it's not 
necessarily true that what you have before the {{?}} is a directive name, or 
even something that evaluates to a directive. It can be anything.


was (Author: ddekany):
What IDE are you using?

The important thing to realize is that the thing after the {{<@}} is just a 
generic expression, and not a directive name. But in the most frequent use case 
that expression is like {{someHash.someVariable}}, and so that special case is 
comprehended by the parser, and then it checks in the {{<@.../>}} if the name 
matches, helping the readability of the template. But consider for example 
{{<@(s1 + s2)?interpret>...</@>}}. What would be the meaningful name in the 
end-tag? But, I do know what {{?spread_args(...) does}}, and so we know that 
while it returns a new, anonymous directive, it's kind of the same directive 
than it what's was applied on. So I could add a special case for 
{{?spread_args(...)}}, but not in general for {{?}}, because it's not 
necessarily true that what you have before the {{?}} is a directive name, or 
even something that evaluates to a directive. It can be anything.

> 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