Télécharger codes, et binaires Linux (archive 7Z 5.08Ko)

1.lua

print("Hallo von Lua!")

1.c

#include "lua50/lua.h"
#include "lua50/lualib.h"
#include "lua50/lauxlib.h"

/*
   Ceci n'est pas de la programmation Lua à proprement parler, mais son
   Interaction de l'interpréteur Lua et un exécutable C.

   Cette pratique permet d'intégrer (embedding) l'interpréteur, exactement
   comme de grosses applications le font (Far Cry, etc...) lorsqu'elles
   ont besoin d'interfacer du code utilisateur par des scripts triviaux.
*/

int main(int argc, char* argv[])
{
  lua_State* L = lua_open();
  luaopen_base(L);
  luaopen_io(L);

  lua_dofile(L,"1.lua");

  lua_close(L);
  return 0;
}

/*
Compiler/Exécuter avec
  $ gcc -Wall -s -o 1 1.c -llua50 -llualib50 
  $ ./1
  Hallo von Lua!

 Ce qui se passe, c'est que l'interpréteur Lua est intégré dans l' exécutable,
 en étant linké é la compilation.

 Lua permet la précompilation de code Lua en bytecode:
 $ luac -s -o hello.bytecode 1.lua
 Ce bytecode est également interprétable par "notre" exécutable:
 $ ./1 hello.bytecode
  Hallo von Lua!
 112 octets le fichier. C'est mieux que le meilleur des assembleurs.

*/

Exposer une fonction

#include "lua50/lua.h"
#include "lua50/lualib.h"
#include "lua50/lauxlib.h"

/*
  Ceci est une transposition en C du code C++ de http://csl.sublevel3.org/lua/

  Consiste é écrire une fonction C et l' appeler depuis un script
  Lua. Pour celé il faut enregistrer la fonction dans l'environnnement Lua
  avec lua_register().

  Additionnellement, une fonction récupére les erreurs retournées par
  l'interprétation du script.

  Pour différencier ce que dit l'exécutable et le script, un '>' précéde les
  messages de l' exécutable.
*/

/* La fonction prend x arguments et retourne un nombre avec lua_pushnumber() */
int ma_function(lua_State *L)
{
  int argc, n;
  argc = lua_gettop(L);

  printf("> ma_function() appelée avec %d arguments\n", argc);

  for (n=1; n<=argc; ++n )
    printf("> argument %d: %s\n", n, lua_tostring(L, n) );

  lua_pushnumber(L, 123); // return value
  return 1; // number of return values
}

void report_errors(lua_State *L, int status) {
  if ( status!=0 ) {
    printf("%s\n", lua_tostring(L, -1) );
    lua_pop(L, 1); // remove error message
  }
}

int main(int argc, char* argv[])
{
   int n;
   const char* file;

   if (argc<2)
   {
    puts("usage: ./2 [FICHIER.LUA]");
    return 1;
   }

   // exécute chaque fichier passé en argument
   for (n=1; n<argc; ++n ) {
      file = argv[n];

      lua_State* L = lua_open();
      luaopen_io(L); // provides io.*
      luaopen_base(L);
      luaopen_table(L);
      luaopen_string(L);
      luaopen_math(L);
      luaopen_loadlib(L);
 
      // Enregistre la fonction en lui passant le pointeur de fonction
      // la partie entre guillemets apparaitra dans le script.
      lua_register(L, "ma_function", ma_function);

      printf("> Chargement de %s\n", file);
      int s = luaL_loadfile(L, file);

      // Execute programme Lua
      if ( s==0 ) s = lua_pcall(L, 0, LUA_MULTRET, 0);

      report_errors(L, s);
      // terminato
      lua_close(L);
  }
 
  return 0;
}

/*
 Compilation:
 $ gcc -Wall -s -o 2 2.c -llua50 -llualib50 

 Le script 2.lua:
  io.write("Running ", _VERSION, "\n")
  a = ma_function(1, 2, 3, "abc", "def")
  io.write("ma_function() a returné ", a, "\n"

 Ce script commence par écrire la version de l'interpréteur lua.
 Ensuite il déclare une fonction (LA fonction C) l' appelle en
 lui passant 5 arguments.
 Enfin il affiche ce qu'a retourné la fonction.

 Exécution:
 $ ./2 2.lua
 > Chargement de 2.lua
 2.lua:4: `)' expected (to close `(' at line 3) near `<eof>'

 L'erreur du scirpt est récupérée. La corriger, puis

 $ ./2 2.lua
 > Chargement de 2.lua
 Running Lua 5.0.2
 > ma_function() appelee avec 5 arguments
 > argument 1: 1
 > argument 2: 2
 > argument 3: 3
 > argument 4: abc
 > argument 5: def
 ma_function() returned 123

*/

2.lua

io.write("Running ", _VERSION, "\n")
a = ma_function(1, 2, 3, "abc", "def")
io.write("ma_function() returned ", a, "\n")