Given a closure reference or a method handle, one can convert it to an instance of an interface with a single method declaration, as in:
local function listener = |handler| -> asInterfaceInstance(ActionListener.class, handler) # (...) let button = JButton("Click me!") button: addActionListener(listener(|event| -> println("Clicked!")))
It is possible to test if an object is a closure or not with the isClosure
function. This is
useful to support values and delayed evaluation, as in:
if isClosure(value) { map: put(key, value()) } else { map: put(key, value) }
You can get a reference to a closure using the predefined fun
function:
import golotest.Closures local function local_fun = |x| -> x + 1 function call_local_fun = { let f = fun("local_fun", golotest.Closures.module) return f(1) }
Because functions may be overloaded, there is a form that accepts an extra parameter for specifying the number of parameters:
import golotest.Closures local function local_fun = |x| -> x + 1 function call_local_fun = { let f = fun("local_fun", golotest.Closures.module, 1) return f(1) }