среда, 20 января 2010 г.

Язык Lua

Шелл lua запускается довольно шустро, решил еще некоторые тесты провести. Итак, встраиваем интерпретатор в сишную программу.

Скрипт читается с stdin

/*
Compile as
gcc -o2 -I/usr/include/lua5.1/ -llua5.1 lua.c -o lua

Use as
echo -e "a = 1 + 1;\nprint( a);\n"|./lua
*/
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main (void) {
char buff[256];
int error;
lua_State *L = lua_open();
luaL_openlibs(L);

while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff), "line") || lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); // pop error message from the stack
}
}

lua_close(L);
return 0;
}

Скрипт вкомпилирован в тело программы

/*
Compile as
gcc -o2 -I/usr/include/lua5.1/ -llua5.1 lua.c -o lua

Use as
./lua
*/
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main (void) {
int error;
lua_State *L = lua_open();
luaL_openlibs(L);

char* buff = "a = 1 + 1;\nprint( a);\n";
error = luaL_loadbuffer(L, buff, strlen(buff), "line") || lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); // pop error message from the stack
}

lua_close(L);
return 0;
}


Что ж, работает. А теперь посмотрим, что же можно на этом луа делать. Например, обращение к SQLite базе данных:


require "luasql.sqlite3"

db = sqlite3.open("example-db.sqlite3")

db:exec[[ CREATE TABLE test (id, content) ]]

stmt = db:prepare[[ INSERT INTO test VALUES (:key, :value) ]]

stmt:bind{ key = 1, value = "Hello World" }:exec()
stmt:bind{ key = 2, value = "Hello Lua" }:exec()
stmt:bind{ key = 3, value = "Hello Sqlite3" }:exec()

for row in db:rows("SELECT * FROM test") do
print(row.id, row.content)
end


А вот это уже не работает. Сильно напоминает питоновские проблемы с несовместимостью минорных версий интерпретатора с библиотеками. Резюме - обойдусь без lua.

Upd.
В debian-russian подсказали вот такой вариант:

require "luasql.sqlite3"
env = luasql.sqlite3()
db=env:connect("example-db.sqlite3")
db:execute[[ CREATE TABLE test (id, content) ]]

Оно работает, но писать тест на луа уже неинтересно.

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru