Вопрос
Не могли бы вы привести фрагмент кода, показывающий, как использовать Lua, встроенный в OCaml?
Простым примером может быть вариант «Hello, World».Попросите OCaml запросить у пользователя имя.Затем передайте это имя функции Lua.Попросите Lua напечатать приветствие и вернуть длину имени.Затем попросите OCaml напечатать сообщение о длине имени.
Пример:
пользователь@рабочего стола:~$ ./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.mlOCaml запрашивает имя, вызывает функцию 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;;
Решение
Мне неизвестен зрелый набор привязок для встраивания реализации Lua на языке C в OCaml.Незрелый набор креплений был размещен в списке рассылки Caml в 2004 г..
Если вы хотите использовать реализацию ML, вы можете найти несколько примеров в статье под названием Мания модулей ML.Реализация ML, в отличие от реализации C, гарантирует безопасность типов, но для этого используются некоторые очень грязные приемы в системе модулей ML.Если вы задаете базовые вопросы, вы, вероятно, захотите этого избежать.
В вашем примере немного сложно догадаться, откуда вы хотите получить функцию.Я предлагаю вам либо попросить пример на C, либо дать людям пример на C и спросить, как его можно реализовать в OCaml (хотя я думаю, что привязки будут проблемой).
Редактировать
Отвечая на пересмотренный вопрос, это довольно сложно.Обычная модель заключается в том, что вы назначаете Lua ответственным и вызываете код Objective Caml из Lua.Вы назначаете Камла ответственным, что усложняет ситуацию.Вот приблизительный набросок того, как все может выглядеть:
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
модули.
Другие советы
Если подумать, я не уверен, что вы сможете сделать это с официальной реализацией Lua на языке C, потому что я думаю, что OCaml считает, что он владеет main()
.Вам нужно будет выяснить, можно ли упаковать OCaml как библиотеку из основной программы C.
В качестве примера назначения Lua-ML ответственным вы можете получить Lua-ML автономный с Cminusminus.org, а также вы можете ознакомиться с примерами в бумага на Lua-ML а также исходный код для КК — компилятор сам.