2017年9月6日水曜日

Luaのコードを文字列として持つ

 Luaのコードをファイルから読むサンプルはよくあるが、それじゃただのインタプリタなので、自分で処理を書く意味がない。ということで、とりあえず変数にコードの文字列を持つようにしてみた。

#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 件のコメント:

コメントを投稿