Вопрос

Не могли бы вы привести фрагмент кода, показывающий, как использовать 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 а также исходный код для КК — компилятор сам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top