Вы можете разыграть ссылку на метод
asyncMethod().addListener((GenericFutureListener<Future<String>>) Example::callback);
Это менее многословно, но все же не идеально. Чтобы немного улучшить это решение, вы можете переместить определение длинного типа в функциональный интерфейс
class Example {
@FunctionalInterface
private interface Callback extends GenericFutureListener<Future<String>> {
void operationComplete(Future<String> future) throws Exception;
}
private static void callback(Future<String> future) {
System.out.println(future.getNow());
}
public static void main(String[] args) {
asyncMethod().addListener((Callback) Example::callback);
}
}
Или вы можете заключить обратный вызов в лямбда с типизированным аргументом
asyncMethod().addListener((Future<String> f) -> callback(f));
Может быть, это можно сделать лучше, ИДК.
Я не знаю о сформировавшемся наборе привязки для встраивания реализации C Lua в OCaml. Незрелый набор привязки был отправлен в списке рассылки Caml в 2004.
Если Вы хотите использовать реализацию ML, можно найти некоторые примеры в газете под названием Мания Модуля ML. Реализация ML, в отличие от реализации C, гарантирует безопасность типов, но сделать так она использует немного очень приемы цинги в системе модуля ML. Если Вы задаете основные вопросы, Вы, вероятно, хотите избежать этого.
В Вашем примере немного трудно предположить, где Вы хотите, чтобы функция прибыла из. Я предлагаю Вас или прошу пример C или даю людям пример C, и спросите, как он мог быть понят в OCaml (хотя я думаю, что привязка будет проблемой).
В ответ на пересмотренный вопрос это довольно сложно. Обычная модель - то, что Вы назначили бы Lua ответственным, и Вы назовете Объективный код Caml от Lua. Вы назначаете Caml ответственным, который делает вещи более сложными. Вот грубый эскиз того, на что могли бы быть похожими вещи:
let lua = Lua.new() (* create Lua interpreter *)
let chunk = LuaL.loadfile lua "hello.lua" (* load and compile the file hello.lua *)
let _ = Lua.call lua 0 0 (* run the code to create the hello function *)
let lua_len s =
(* push the function; push the arg; call; grab the result; pop it; return *)
let _ = Lua.getglobal lua "lua_hello" in
let _ = Lua.pushstring lua s in
let _ = Lua.call lua 1 1 in
let len = Lua.tointeger lua (-1) in
let _ = Lua.pop lua 1 in
len
let () = print_string "Name? "; flush stdout
let name = input_line stdin
let len = lua_len name
Printf.printf "Your name is %d letters long." len; flush stdout;;
Снова, я не знаю, где Вы получите привязку для Lua
и LuaL
модули.
На дальнейшем отражении я не уверен, можно ли сделать это с официальной реализацией C Lua, потому что я думаю, что OCaml полагает, что это владеет main()
. Необходимо было бы узнать, мог ли OCaml быть упакован как библиотека из основной программы C.
Для примера назначения ответственного Lua-ML можно получить Lua-ML, автономный из Cminusminus.org, и можно также проверить примеры в статье о Lua-ML, а также исходном коде королевскому адвокату - сам компилятор.