Question

Pourriez-vous, s'il vous plaît, donner un extrait de code montrant comment utiliser Lua intégré à OCaml?

Voici un exemple simple: "Bonjour le monde". une variante. Demandez à OCaml d’inviter l’utilisateur à donner un nom. Puis passez ce nom à une fonction Lua. Demandez à Lua d'imprimer un message d'accueil et de renvoyer la longueur du nom. Ensuite, demandez à OCaml d’imprimer un message sur la longueur du nom.

Exemple:

  

utilisateur @ bureau: ~ $ ./ bonjour.opt

     

Nom? utilisateur

     

Bonjour, utilisateur.

     

Votre nom comporte 4 lettres.

     

utilisateur @ bureau: ~ $

[Modifier]

En tant que programmeur non-C, puis-je implémenter cela sans avoir à écrire un programme C intermédiaire pour transmettre les données entre Lua et OCaml?

Ce qui suit est une idée théorique de ce que je voudrais essayer. Malheureusement, la ligne 3 de ocaml_hello.ml aurait besoin de savoir comment appeler la fonction définie dans lua_hello.lua pour que le code soit valide.

lua_hello.lua Définit lua_hello, qui affiche un argument et renvoie sa longueur.

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

ocaml_hello.ml OCaml demande un nom, appelle la fonction Lua et affiche la valeur de retour.

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;;
Était-ce utile?

La solution

Je ne suis pas au courant d'un ensemble de liaisons abouti pour intégrer l'implémentation C de Lua dans OCaml. Un ensemble immature de liaisons a été publié sur la liste de diffusion de Caml en 2004 .

Si vous souhaitez utiliser l’implémentation ML, vous trouverez des exemples dans un document intitulé Mania ML Module . L'implémentation ML, contrairement à l'implémentation C, garantit la sécurité des types, mais pour ce faire, elle utilise des astuces très scorbut dans le système de modules ML. Si vous posez des questions de base, vous voudrez probablement éviter cela.

Dans votre exemple, il est un peu difficile de deviner d'où vous voulez que la fonction vienne. Je vous suggère de demander un exemple C ou de donner un exemple C aux gens et de demander comment cela pourrait être réalisé dans OCaml (bien que je pense que les liaisons seront un problème).

Modifier

En réponse à la question révisée, c'est assez compliqué. Le modèle habituel est de mettre Lua en charge et d'appeler le code Objective Caml de Lua. Vous mettez Caml aux commandes, ce qui rend les choses plus compliquées. Voici un aperçu de ce à quoi les choses pourraient ressembler:

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

Encore une fois, je ne sais pas où vous obtiendrez les liaisons pour les modules Lua et LuaL .

Autres conseils

Après réflexion, je ne suis pas sûr que vous puissiez le faire avec l'implémentation C officielle de Lua, car je pense qu'OCaml pense posséder main () . Vous devez savoir si OCaml peut être empaqueté en tant que bibliothèque à partir d’un programme principal C.

Pour un exemple de prise en charge de Lua-ML, vous pouvez obtenir Lua-ML autonome sur Cminusminus.org, et vous pouvez également consulter les exemples dans papier sur Lua-ML ainsi que le code source du QC-- compilateur lui-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top