初探 lua

lua 是一个很小的语言,用 ANSI C 实现,主要用来做 scripting,方便嵌入到应用里面。这里是官方主页,文档不错。

我们这里初探怎么写一个简单的 lua 的 C++ binding,似乎市面上已经有不少类似的 library 了,这里纯粹是作为学习一个技术储备来用,类似的其他的脚本语言可以借鉴。不过 lua 的实现本身也比较特别。

第一层抽象是在 lua_State 上建立的,所有的操作都围绕着这个神奇的结构。因此我们首先建立下面的一个类

#include <memory>
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}

namespace lua {
  namespace detail {
    struct lua_deleter {
      void
      operator() (lua_State* s) const {
        lua_close(s);
      }
    };
  }

  class vm {
    std::unique_ptr<lua_State, detail::lua_deleter> state;

  public:
    vm() : state(luaL_newstate()) {}

    inline vm& libs () {
      luaL_openlibs (state.get ());
      return *this;
    }

    inline vm& run(const std::string& fn) {
      if (0 == luaL_dofile (state.get (), fn.c_str()))
        return *this;
      else
        throw std::runtime_error("error in executing " + fn);
    }
  }
}

这里借鉴了 unique_ptr 作为 owner,可能更好的是禁止掉 copy/assign 这类操作,对此没啥作用。这里直接用 auxlib 里面几个函数帮助我们实现几个基本的功能,比如加载 library、执行文件。至此我们就能简单的通过 C++ 程序执行 hello world 了。

#include "vm.hpp"

int
main(int argc, char* argv[]) {
  lua::vm vm;
  vm.libs ()
    .run ("hello.lua");

  return 0;
}

对应的 hello.lua 就是 print(“hello world”) 一行。执行我们的程序打印出来了 hello world。有了这基本的功能,我们就能很容易执行一段 lua 程序。后面的问题就是如何在 C++ 里面调用 lua 的程序,以及如何在 lua 程序里面使用 C++ 的对象了。

——————
And Jacob lifted up his eyes, and looked, and, behold, Esau came, and with him four hundred men. And he divided the children unto Leah, and unto Rachel, and unto the two handmaids

Advertisements
初探 lua

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s