■ DEBUG
local v = 0;
function testHook()
print("Debug v = "..v);
end
-- 実行文がよばれる直前に testHook を呼ぶ.
debug.sethook( testHook, "l" );
v = v + 1;
POINT
最終的にスタックは元の状態に戻っている
これは良いプログラミング作法
■ Coroutine(Co-routine)
複数の coroutine を作成できるが, 平行して動作することはできない.
互いに譲りあい( yield ) ながら作業をする。
協調的 multithread
OS が CPU の実行を切り替えながらする作業を,
PreemptiveMultiTask という.
先制. ( 先買権 == はやいもの勝ち )
[ 実行処理自体 == worker ]が 切り替えの合図を送るのが,
NonPreenptiveMultiTask
だから協調 ( だから yield )
POINT
Coroutine とは 実行を一時中断して, 後で再開する仕組みのこと。
自分で中断を宣言することが、 OS の管理する multithread とは異なる。
自分で yield() をコールして初めて中断される。
Coroutign 作成. ( worker ) // thread object をかえす.
thread = coroutine.create;
2. main() 関数にわたす. ( Job )
main( thread, prm ... );
3. coroutine を稼働させる.
coroutine.resume() で稼働させる.
4. 終了をまつか, yield を実行する.
条件式は任意の値OK.( false と nil は共に偽 )
■ Luaのつかいみち
設定ファイルとして扱う
Lua format を利用する
Var=Val;( これを自分で解釈( Interprete )する )
-- lua でグローバル変数を設定。
var=10;
foo.cpp
lua_getglobal( s, "var" ); // globalTbl から var key stack にのせる
luaL_checknumber( s, -1 ); // stack から値を取得する.
C から lua のグローバル変数を設定する。
lua_pushstring(s, "test");
lua_setfield(s, LUA_GLOBALSINDEX, "name");
■ C 言語が主体
指定したところで, Lua にうつり, 処理がおわったら Lua から戻る。
ある処理における Callback の際に使う。
MVC でいうところの Control を Lua から制御する
Controler の機能を Lua に公開する
Controller, Data ともに C 側にある
■ Lua が主体
Lua 側に data, Controler を配置. ( Lua の data 構造を利用可能. )
設定 file は Lua 変数を扱うだけになる.
Gui は Lua でサポートされる必要がある.
Controller, Data ともに Lua 側にある.
■ hash
Hash とは,
文字列を数値に変換したもの. ( 検索する際に数値に変換して高速に検索する )
均等に分布するのが良い Hash 関数。
比較を用意にすることが目的.
Lua は内部に Hash 関数をもつ
Lua には Switch 文がない. ( if-elseif ... | table )で代用.
■ _G
DESC
グローバル環境を保持するグローバル変数
[ Lua の環境 ]と呼ばれる, global 変数をもつテーブルのこと。
POINT
__index : field に値を入れる時に使用される method.
a = 1; < -> _G.a = 1;
■ registory
registory とは 定義済みの [ table ]
好きなLuaの値を格納するために [ Cのコードから ]使うことができる.
疑似 index [ LUA_REGISTRYINDEX ]に置かれている
KEY が重複しないように注意すること.
Cオブジェクトのアドレスを持つライトユーザーデータ を用いるとよい.
■ lua_checkstack
SYNTAX
int lua_checkstack (lua_State *L, int n );
DESC
スタックに n の空きがあるかチェックする。
チェックするだけでスタックのサイズは変更しない。
STACK
[-0, +0, m]
RET
false : スタックに n 個の空きがない。
■ table に weakReference の設定をする
POINT
( table には 予約済みの field がある )
[ __mode ] field に "k" を含む -> KEY が weakReference
[ __mode ] field に "v" を含む -> VAL が weakReference
■ 擬似インデックス
スタック内に無いいくつかのLuaの値に[ Cのコードから ]アクセスするためのもの
stack 以外にある Lua が管理する値を 指すINDEX
どの関数も 疑似インデックス と呼ばれる有効なインデックスを受け付ける
LUA_GLOBALSINDEX : スレッドの環境 (グローバル変数がある場所)
LUA_ENVIRONINDEX : 実行中の C の関数の環境がある 擬似インデックス