Lua

classの記述を簡潔に書けるようにする

Lua

Codifyでclassを記述する時の方法が以下の様な感じで、metatableを意識しないで書けるのがとても良かったので実装してみた。 Vec3 = class() function Vec3:init(x,y,z) self.x,self.y,self.z = x,y,z print("vec3:init",x,y,z) end function Vec3:dump() pr…

多値返却

Luaは関数で複数の値を返すことができるけどそれをテーブルに突っ込んだらどうなるのかテスト。 function test() return 1,2,3 end t = { test(), test(), test() } for i,v in pairs(t) do print(v) end 出力 1 1 1 2 3 一応多値は展開されてるけど、展開さ…

C/C++へのLua組み込みの実践

後半ガベコレ周りとかデバッグ環境の奴以外はLua初心者向けな感じ。 動的リロードっても実際リロードできる部分は限られてるというのを聞いてやっぱりそうですよね的な。 do_stringやdo_file一発で終わるようなものは動的リロードしやすいけど、コルーチン使…

Google Code Jam

クオリファイをすっぽかしたので、参加できずorz http://code.google.com/codejam/contest/dashboard?c=agdjb2RlamFtchALEghjb250ZXN0cxin2QUM それでもLuaでテストだけしてみた。 Smallな入力なら普通に終わるんだけど、Largeだとまずテスト時間内に計算が…

require/module

全然使ったことないんですけど、いろんな人のLuaソース見てると結構使ってたりするので調べた。 モジュール名.lua module("モジュール名",package.seeall) ってやると名前空間みたいな感じで"モジュール名"のテーブルがグローバルに追加されてスコープもモジ…

モジュールワロタ

調べた直後にこれですかw http://d.hatena.ne.jp/sa28/20080221 http://lua-users.org/wiki/LuaModuleFunctionCritiqued まぁただdisるのは簡単なので使ってからdisってみます。

Pairsの話

Luaで自前でイテレーションしたい時がたまにある。 要素がnilの時の扱いがnextとpairsとかで違うからだ。 サイズを取得するときも最初にnilを発見した所までのサイズしか返さないので、適当にnilを突っ込んでるの忘れてるとよく分からないバグに遭遇したりす…

0を集合から除外する

nが0の時は0、0以外のときは1にしたい時は以下のようにすべし 1-0^nmath.minでクランプするのでもいいけど長すぎる。 計算は遅いだろうけどgolfだからモウマンタイ。

2項演算子を使った3項演算子風実装

exp and val1 or val2expがtrueならval1、falseならval2を返す。 trueとfalseを返すような使い方をすると難しいけど、(val1がfalseだとval2が選択されてしまう)そういう使い方しなければ便利。 expがtrue val1(nil,false以外)が選択され、orは左の項がfalse…

2項演算子(論理演算子)

"or" "and"は2項演算子として機能する or...左辺がnil/falseの場合右辺の値を返す。それ以外は左辺の値を返す and...左辺がnil/falseの場合nil/falseを返す。それ以外は右辺の値を返す きもすぎるが、orは結構使える。 関数のど頭で引数がnilだったら仮の値…

リスト定義時のtips

local var = { [3] = "A", [4] = "BB", [5] = "CCC", [8] = "DDDD", } for i=1,8 do print( var[i] ) end ======================================= (nil) (nil) A BB CCC (nil) (nil) DDDD リスト定義時にリスト内の任意の場所に値をセットできると。そんだ…

便利になった部分

剰余算命令の追加 '%'で剰余が求められるようになった。便利ですね。 テーブルサイズの取得演算子 '#'をテーブル名の前につけるとサイズが取ってこれるようになりました。便利ですね。 table.getn()とかやんなくて済むのでいいですが、演算子だとパッと見わ…

導入してみた

Lua5.1を導入してみてつまづいたところ一覧 lua_dofileが無い luaL_dofileで解決 luaopen_loadlibが無い luaopen_base以外はluaL_openlibs テーブルをなめるfor文が通らなくなった local tbl = {1,2,43,56,7,8,} for i in tbl do io.write( "tbl[" .. i .. "…

継承とかその辺

今更書き古されてると思うんだけど、メモる。 __index リストがインデクスや、メンバ名で"参照"されたときに(関数呼び出しを含む)代わりに参照される変数、リスト __newindex リストのインデクスや、メンバ名に"新規代入"されたときに代わりに参照される変…

GameMonkey

最近は、日本国内でもLuaがかなり流行ってきていると印象を受けるんだけど、 同じくらい「使うな!」指令が出ている話をちらほら聞くようになってきた。 Lua使ったらぶっ殺す http://d.hatena.ne.jp/n5v2/20060106 使っては見たものの処理オチが酷くて導入し…

テクニックとかメモ

値を複数受け取る時 local function foo() return 1,2 end local val1,val2 = foo()上記のように記述してもval2はローカル変数として扱われる。 Cの関数で置き換え var = { foo = function() 〜処理〜 end, } var.foo()Cでhogeを作ってluaに登録. var = { fo…

ローカル変数の罠2

昨日の問題はlua_getstackをあらかじめ行っておくことで解決できるかと思ったんだけど、 lua_getstackで取ってくるスタックの位置が相対的な状態で結局参照できなかった。 ファイル単位でのグローバルスコープにあるローカル変数は、 参照がない時はほとんど…

ローカル変数の罠

--test.lua local a = 1 local b = 2 local c = 3 local d = { 1, 2, 3, 4, 5, } lua_test = { OnUpdate = function(this) print("call lua_test::OnUpdate( a=" .. a .. ",b=" .. b .. ",c=" .. c .. " )\n") end, OnFinalize = function(this) a = nil b =…

luaのlocal functionをCから呼び出す

って書くと普通に関数名を積んでgettableしてからpcallなりすればいいじゃんて思われそうですが、local関数だとC側からlocalのスコープを特定できないので呼び出せないわけですよ。 他のluaファイルにも同じ関数名とかあるだろうし。 ということでpcallでき…

ネームスペース風の改造

このエントリ(http://d.hatena.ne.jp/tattyu/20050927#p3)で書いたやり方なんですけど、 FarCryのLuaを眺めていたらよりネームスペースのように書ける事に気がついた。 --lua_test.lua lua_test = { abc = 10, OnUpdate = function(this) print("call lua_te…

ジャンプ命令

http://lua-users.org/lists/lua-l/2004-09/msg00244.html ジャンプ命令あるんだー。 そうそう、Luaって一旦読み込んで実行したらシンボルとかファンクションとかずっとLuaの管理領域メモリに残るわけじゃないですか。 そういうのってどうやって消せばいいん…

へっぽこチャンクネームスペース風メソッドコール

C側の実装 void Call(lua_State *L, const char *chunk, const char *func ) { lua_pushstring( L, chunk ); lua_gettable( L, LUA_GLOBALSINDEX ); lua_pushstring( L, func ); lua_gettable( L, -2 ); const int result = lua_pcall( L, 0, 0, 0 ); if ( r…