Встраивание Lua в OCaml

Вы можете разыграть ссылку на метод

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));

Может быть, это можно сделать лучше, ИДК.

7
задан Thomas 5 May 2012 в 10:08
поделиться

2 ответа

Я не знаю о сформировавшемся наборе привязки для встраивания реализации 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 модули.

8
ответ дан 7 December 2019 в 05:32
поделиться

На дальнейшем отражении я не уверен, можно ли сделать это с официальной реализацией C Lua, потому что я думаю, что OCaml полагает, что это владеет main(). Необходимо было бы узнать, мог ли OCaml быть упакован как библиотека из основной программы C.

Для примера назначения ответственного Lua-ML можно получить Lua-ML, автономный из Cminusminus.org, и можно также проверить примеры в статье о Lua-ML, а также исходном коде королевскому адвокату - сам компилятор.

0
ответ дан 7 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: