スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Plutoを使ってLuaの状態を永続化

日本語の情報が皆無な気がするので書いてみる。といっても実際に誰かの役に立つのか疑問なんだが。
http://luaforge.net/projects/pluto/からダウンロードする。Makefileを適当に直してコンパイル・インストールする。Lua 5.1.3用だが、Lua 5.1.4でもそんなに問題はないと思う。
C/Luaのどちらからでも使えるが、ここではLuaから使う。
  1. require "pluto"
    まずライブラリをロードしないと話にならない。
  2. str = pluto.persist(perms,obj)
    objを文字列にして返す。permsで永続化したくないもの・永続化出来ないものを指定するらしい。
  3. obj = pluto.unpersist(perms,str)
    文字列からobjを復元する。permsは上と同じと言いたいところだが、キーと値が逆になってる。
実際に使ってみる。
$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require "pluto"
> myobj = {"Hello",3.14159265,function() return "hoge" end}
> myobj.hoge = myobj
> io.open("myobj","wb"):write(pluto.persist({},myobj))
> ^D
ここではmyobjというテーブルをつくり、myobjというファイルに書き出している。 次に、この書き出されたファイルからmyobjを復元する。
$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require "pluto"
> myobj = pluto.unpersist({},io.open("myobj","rb"):read("*a"))
> =myobj[1]
Hello
> =myobj[2]
3.14159265
> =myobj[3]
function: 0x12af60
> =myobj[3]()
hoge
> =myobj
table: 0x12af00
> =myobj.hoge 
table: 0x12af00
> ^D
しっかり復元されている。myobj.hogeがmyobj自身を指していたが、これも復元された。
次はpermsを使ってみる。permsはテーブルで、永続化したくないもの・永続化出来ないものをキーに、ユニークな値を値に設定する。unpersistのときはキーと値が逆になる。
$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require "pluto"
> myobj = {globals=_G,print=print}
> perms = {}
> perms[_G] = 123
> perms[print] = "print"
> io.open("myobj","wb"):write(pluto.persist(perms,myobj))
> ^D
$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require "pluto"
> perms = {}
> perms[123] = _G
> perms["print"] = print
> myobj = pluto.unpersist(perms,io.open("myobj","rb"):read("*a"))
> =_G
table: 0x1003d0
> =myobj.globals
table: 0x1003d0
> =print
function: 0x1010d0
> =myobj.print
function: 0x1010d0
> myobj.print("Hello world!")
Hello world!
> ^D
TODO: メタテーブルの取り扱いについて書く
スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。