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

Chaitanya Birudavolu commented on GROOVY-8952:
----------------------------------------------

[~blackdrag], I looked at the link you've pointed to, and it doesn't seem to 
cover the scenario I'm talking about. It talks about an eager placeholder 
*${<expression>}*, where the type of *<expression>* is not Closure. It also 
talks about the lazy placeholder *${->}*, which is surely not the same thing as 
an an eager placeholder enclosing an expression of type Closure.

(Can I just say PH instead of placeholder?).

Referring back to the code I posted, notice that I have an eager PH *${}*, 
enclosing an expression whose value is of type Closure. As per all 
documentation that I've seen so far, for any PH (be it an eager one *${}* or a 
lazy one *${->}*), what must eventually appear in the place of the PH is 
*<expression-value>.toString()*, where *<expression-value>* is the value of 
whatever is enclosed by the PH.

The problem which we are discussing however, is that when we have an *eager* PH 
*${}* and if the type of *<expression-value>* is GString, three things happen, 
all of which are surprises, and not documented:
 # An invocation of the closure is happening.
 # The invocation of the closure is happening lazily rather than eagerly, even 
though the PH enclosing *<expression>* is an *eager* one *${}* as in my code. 
For an eager PH *${}*, the substitution should happen eagerly, and what we 
finally get in the place of the PH should not depend upon when the GString 
coercion to String happens.
 # In the place of the PH, instead of the result of 
*<expression-value>.toString()*, what is actually appearing is the result of 
*<expression-value>.call().toString()*

> Eager interpolation evaluating as a Closure does a lazy invoke of the Closure
> -----------------------------------------------------------------------------
>
>                 Key: GROOVY-8952
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8952
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.5.5
>         Environment: Windows 10
>            Reporter: Chaitanya Birudavolu
>            Priority: Major
>              Labels: closure, eager, interpolation
>
> This is regarding the eager interpolation placeholder
> {code:java}
> ${ <expression> }{code}
> The expected behavior is that the expression would be evaluated eagerly (at 
> GString creation time). Later, at GString coercion time, the value that is 
> expected in the place of the eager placeholder is the result of
> {code:java}
> <expression>.toString(){code}
>  
>  
> This works most of the time, but doesn't seem to work if the expression 
> evaluates to a Closure type. If the expression evaluates to a Closure type, 
> what is observed is that, in the place of the placeholder, instead of seeing 
> ...
> {code:java}
> <closure>.toString(){code}
> ... we see...
> {code:java}
> <closure-invocation-result>.toString(){code}
> For example, in the below code...
>  
> {code:java}
> def c = {->println ('Inside closure')}
> println ('Just before creating the GString')
> def gstr = "${println ('Inside eager placeholder'); 20; 30; c}"
> println ('Just after creating the GString')
> println (gstr)
> {code}
>  
> ...the expected behavior is that the closure should never get executed, and 
> the last println should only print the result of
> {code:java}
> c.toString(){code}
> Instead, the last line printed is observed to be:
> {code:java}
> Inside closure{code}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to