Язык Lua
Шелл lua запускается довольно шустро, решил еще некоторые тесты провести. Итак, встраиваем интерпретатор в сишную программу.
Скрипт читается с stdin
Скрипт вкомпилирован в тело программы
Что ж, работает. А теперь посмотрим, что же можно на этом луа делать. Например, обращение к SQLite базе данных:
А вот это уже не работает. Сильно напоминает питоновские проблемы с несовместимостью минорных версий интерпретатора с библиотеками. Резюме - обойдусь без lua.
Upd.
В debian-russian подсказали вот такой вариант:
Оно работает, но писать тест на луа уже неинтересно.
Скрипт читается с 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) ]]
Оно работает, но писать тест на луа уже неинтересно.
Comments