On 22.12.2017 00:20, Paul King wrote:
I suspect this is intentional but was before my time. Try this also:

int triggered = 0
def o1 = { -> triggered++ }
def o2 = { println '*' + it; triggered++ }

println(o1) // ConsoleScript11$_run_closure1@xxxxxxxx
println(o2) // ConsoleScript11$_run_closure2@yyyyyyyy

assert triggered == 0
println("xyzzy$o1") // xyzzy0
assert triggered == 1
println("XX${o2}YY${o2(42)}ZZ") // *42\n*XX\nXXYY1ZZ
assert triggered == 3

ah yes... good old times with John Wilson... I think the idea was back then to leverage the Closures for templating engine purposes.. like for example GStringTemplateEngine the whole template in there is basically a Closure and writing is channeld by the writeTo method, that is also used for toString.

I really wonder how much this feature is used. If you look at the code you will see, that it does lead to very surprising behaviour, for example toString on Closure and writeTo in GString do not fit very well together and the GString base evaluation may lead to a double evaluation by working on the result of the Closure call. Plus of course the different behaviour for if the closure does or does not take a parameter where we one time work on the result and one time we ignore the result and instead let the Closure itself work things out.

Frankly, this is on my list of features to be removed. I have not yet fully investigated the impact of this - and I suspect there will be much more impact here than it looks like on first glance

bye Jochen


Reply via email to