Incorporação Lua em OCaml

votos
7

Você poderia, por favor, dê um trecho de código mostrando como usar Lua incorporado em OCaml?

Um exemplo simples pode ser uma variante Olá, mundo. Tem OCaml solicitar ao usuário um nome. Em seguida, passar esse nome para uma função Lua. Têm Lua imprimir uma saudação e retornar o comprimento do nome. Então, OCaml imprimir uma mensagem sobre o comprimento do nome.

Exemplo:

user @ área de trabalho: ~ $ ./hello.opt

Nome? Do utilizador

Olá, Usuário.

O seu nome é de 4 letras.

user @ área de trabalho: ~ $

[Editar]

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

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

lua_hello.lua Define 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.ml OCaml 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;;
Publicado 02/01/2009 em 05:12
fonte usuário
Em outras línguas...                            


2 respostas

votos
8

Eu não estou ciente de um conjunto maduro de ligações para incorporar a implementação C da Lua em OCaml. Um imaturo conjunto de ligações foi postada na lista de discussão Caml em 2004 .

Se você quiser usar a implementação ML pode encontrar alguns exemplos em um artigo chamado ML Módulo Mania . A implementação ML, ao contrário da implementação C, garante segurança de tipo, mas para isso ele usa alguns truques muito escorbuto no sistema módulo ML. Se você está fazendo perguntas básicas, você provavelmente vai querer evitar isso.

No seu exemplo é um pouco difícil de adivinhar onde deseja que a função para vir. Eu sugiro que você quer pedir um exemplo C ou dar às pessoas um exemplo C e perguntar como ele poderia ser realizado em OCaml (embora eu acho que as ligações vão ser um problema).


Editar

Em resposta à pergunta revisto, é muito complicado. O modelo mais comum é que você colocaria Lua no comando, e você chamaria código Caml Objetivo da Lua. Você está colocando Caml no comando, o que torna as coisas mais complicadas. Aqui está um esboço do que as coisas pode parecer:

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

Mais uma vez, eu não sei onde você poderá obter as ligações para o Luae LuaLmódulos.

Respondeu 02/01/2009 em 05:39
fonte usuário

votos
0

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

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

Respondeu 05/01/2009 em 18:44
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more