Pergunta

Você poderia, por favor, fornecer um trecho de código mostrando como usar Lua incorporada no OCaml?

Um exemplo simples poderia ser uma variante “Hello, World”.Faça com que o OCaml solicite um nome ao usuário.Em seguida, passe esse nome para uma função Lua.Faça com que Lua imprima uma saudação e retorne o comprimento do nome.Em seguida, faça com que o OCaml imprima uma mensagem sobre o comprimento do nome.

Exemplo:

usuário@desktop:~$ ./olá.opt

Nome? Do utilizador

Olá, usuário.

Seu nome tem 4 letras.

usuário@desktop:~$

[Editar]

Como um programador não-C, eu poderia implementar isso sem ter que escrever um programa C intermediário para passar os dados entre Lua e OCaml?

A seguir está uma ideia teórica do que eu gostaria de tentar.Infelizmente, a linha 3 de ocaml_hello.ml precisaria saber como chamar a função definida em lua_hello.lua para que o código fosse válido.

lua_hello.luaDefine lua_hello, que imprime um argumento e retorna seu comprimento.

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

ocaml_hello.mlOCaml solicita um nome, chama a função Lua e imprime o valor de retorno.

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;;
Foi útil?

Solução

Não conheço um conjunto maduro de ligações para incorporar a implementação C de Lua no OCaml.Um conjunto imaturo de ligações foi postado na lista de discussão do Caml em 2004.

Se você quiser usar a implementação de ML, você pode encontrar alguns exemplos em um artigo chamado Mania do Módulo ML.A implementação de ML, diferentemente da implementação de C, garante segurança de tipo, mas para isso ela usa alguns truques muito obscenos no sistema de módulos de ML.Se você estiver fazendo perguntas básicas, provavelmente desejará evitar isso.

No seu exemplo, é um pouco difícil adivinhar de onde você deseja que a função venha.Eu sugiro que você peça um exemplo de C ou dê às pessoas um exemplo de C e pergunte como isso poderia ser realizado no OCaml (embora eu ache que as ligações serão um problema).


Editar

Em resposta à pergunta revisada, é bastante complicado.O modelo usual é que você colocaria Lua no comando e chamaria o código Objective Caml de Lua.Você está colocando Caml no comando, o que torna as coisas mais complicadas.Aqui está um esboço de como as coisas podem ser:

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

Novamente, não sei onde você conseguirá as ligações para o Lua e LuaL módulos.

Outras dicas

Pensando melhor, não tenho certeza se você pode fazer isso com a implementação C oficial de Lua, porque acho que OCaml acredita que possui main().Você teria que descobrir se o OCaml poderia ser empacotado como uma biblioteca de um programa C principal.

Para um exemplo de como colocar Lua-ML no comando, você pode obter Lua-ML independente de Cminusminus.org, e você também pode conferir os exemplos no artigo sobre Lua-ML bem como o código-fonte para o QC-- compilador em si.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top