#include <stdio.h> #include <string.h> #include "lua.h" #include "lauxlib.h" #include "lualib.h" // [スクリプト化可能なアプリケーションに Lua を組み込む](https://www.ibm.com/developerworks/jp/linux/library/l-embed-lua/index.html) int main(void) { static const char *codes[] = { "print(\"hello world\")", "abc=123+456\n" "print(abc)\n", }; const int codeCount = sizeof(codes) / sizeof(codes[0]); lua_State *L = luaL_newstate(); luaL_openlibs(L); int i; for (i = 0; i < codeCount; i++) { const char *code = codes[i]; if (luaL_loadbuffer(L, code, strlen(code), "code")) { fprintf(stderr, "lua couldn't parse '%s': %s.\n", code, lua_tostring(L, -1)); lua_pop(L, 1); continue; } if (lua_pcall(L, 0, 1, 0)) { fprintf(stderr, "lua couldn't execute '%s': %s.\n", code, lua_tostring(L, -1)); lua_pop(L, 1); continue; } lua_pop(L, lua_gettop(L)); } lua_close(L); return (0); }
makefileは前回と同様。
このサンプルではスクリプト言語の利点が皆無だが、変数に入った文字列を処理できるようになったというのが大きな進化点。これならマイコンのシリアルコンソールで受け取ったコードを処理したりができる。マイコンのFlashに入れたコードを走らせることだってできるはず。
ちなみに、このサンプルではLuaのコードを文字列で書いているが、luacでバイナリに変換したコードでも処理できる。ただしバイナリだとstrlenが使えないので、そのあたりがちょっと面倒。もしかしたらヘッダとかに容量書いてあるのかもしれないけど。
まぁ、これくらいのコードだとASCIIよりバイナリのほうが容量がでかいという事態になるので、バイナリを使う利点はあんまりないが。
LuaはコンパイラとVMのバージョンが違うと動かないらしいので、マイコンでLuaを走らせて誰かにコードを書いて貰う場合は、そのあたりも色々考える必要がありそう。
0 件のコメント:
コメントを投稿