Встраивание Lua в OCaml - PullRequest
       8

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

7 голосов
/ 02 января 2009

Не могли бы вы дать фрагмент кода, показывающий, как использовать Lua, встроенный в OCaml?

Простым примером может быть вариант "Hello, World". Пусть OCaml запросит у пользователя имя. Затем передайте это имя функции Lua. Пусть Луа напечатает приветствие и вернет длину имени. Затем попросите OCaml напечатать сообщение о длине имени.

Пример:

user @ desktop: ~ $ . / Hello.opt

Имя? Пользователь

Привет, пользователь.

Ваше имя состоит из 4 букв.

Пользователь @ рабочий стол: ~ $

[Изменить]

Как программист, не работающий с C, могу ли я реализовать это без написания промежуточной программы на C для передачи данных между Lua и OCaml?

Ниже приводится теоретическая идея того, что я хотел бы попробовать. К сожалению, строка 3 ocaml_hello.ml должна знать, как вызвать функцию, определенную в lua_hello.lua, чтобы код был действительным.

lua_hello.lua Определяет lua_hello, который печатает аргумент и возвращает его длину.

1  function lua_hello (name)
2    print ("Hello, "..name..".")
3    return (string.len (name))
4  end

ocaml_hello.ml OCaml запрашивает имя, вызывает функцию Lua и печатает возвращаемое значение.

1  let () = print_string "Name? "; flush stdout in
2  let name = input_line stdin in
3  let len  = Lua_hello.lua_hello name in
4    Printf.printf "Your name is %d letters long." len; flush stdout;;

Ответы [ 2 ]

8 голосов
/ 02 января 2009

Мне неизвестен зрелый набор привязок для встраивания C-реализации Lua в OCaml. Незрелый набор привязок был опубликован в списке рассылки Caml в 2004 .

Если вы хотите использовать реализацию ML, вы можете найти несколько примеров в статье под названием ML Module Mania . Реализация ML, в отличие от реализации C, гарантирует безопасность типов, но для этого она использует некоторые очень хитрые приемы в модульной системе ML. Если вы задаете основные вопросы, вы, вероятно, хотите этого избежать.

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


Редактировать

В ответ на пересмотренный вопрос это довольно сложно. Обычная модель заключается в том, что вы назначаете Lua ответственным и называете код Objective 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.

0 голосов
/ 05 января 2009

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

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

...