Lua

ビルトインであってほしい関数群

Lua

メモとして貼り付けておく。 function string.strip(self) return (string.gsub(self, "^%s*(.-)%s*$", "%1")) end function string.split(self, delim) if delim == '' then error("empty separator") end local is, ie local t = {} -- タブ・空白で分割 i…

オブジェクト指向のサンプル

Lua

Foo = {} function Foo:meth1() print(self) end function Foo:new() return setmetatable({}, {__index = Foo}) end foo = Foo:new() foo:meth1() --実行結果 table: 003CB908 上記はオブジェクト指向の最小のサンプル。第一引数にselfを渡す必要ないのであ…

メモ

Lua

ラシウラ: PythonからLuaを呼ぼう (http://d.hatena.ne.jp/bellbind/20090526)

メモ化

Lua

アッカーマン関数+メモ化をいろいろな言語で (http://d.hatena.ne.jp/yppp/20101120/1290228056) function varg_tostring(...) local s = select(1, ...) for n = 2, select('#', ...) do s = s..","..select(n,...) end return s end function memoize(f) …

テーブルのキーにテーブルを入れる

Lua

Luaでは、テーブルは同一判定であって、同値判定ではない。すなわち、 {1,2,3} == {1,2,3} --> false となる。なので、テーブルをテーブルのキーにすることは出来ない。 では、どうすれば良いのかと言うと、テーブルを文字列化してキーとすれば良い。 functi…

LuaCOMの例

Lua

Excelのセルに値を書き込んで、読みだす例。 require 'luacom' excel = luacom.CreateObject('Excel.Application') excel.Visible = true local book = excel.Workbooks:Add() local sheet = book.Worksheets(1) sheet.Cells(1, 1).Value2 = 99 local val = …

package.loadlib() vs alien

Lua

package.loadlib()でのWin32API呼び出しは、うまくいかなかった。恐らくWin32APIの呼び出し規約がstdcallだからだろう。しかし、呼び出し規約がcdeclのprintfを呼び出しても、文字化けしてうまくいかなかった。型を指定していないからだろうか。alienを使用…

assert関数

Lua

assert()は、第一引数にboolean、第二引数にオプションでエラーメッセージを取る。呼び出しが成功した場合は、関数の戻り値を返す。例えば、以下のio.open()はエラーの場合、第一引数にnil、第二引数にエラーメッセージを返す。なので、以下の呼び出し方は定…

ジェネリックforのセマンティクス

Lua

PiL本に載っているが、一応書く。 for var_1, ..., var_n in <explist> do <block> end これは以下のコードと等価。 do local _f, _s, _var = <explist> while true do local var_1, ..., var_n = _f(_s, _var) _var = var_1 if _var == nil then break end <block> end end _fはイテレータ関</block></explist></block></explist>…

Lua本

Lua

現在、『Programming in Lua プログラミング言語Lua公式解説書』を読んでいる。内容は、かなりすばらしい。Luaをやる人は全員読むべき。初め『入門Luaプログラミング』を読んだが、内容がなく買って損した。公式本だけで十分だった。以下は、読んで早速得た…

zip関数(2)

Lua

複数のテーブル対応版。テーブルのリスト部分のみに対応。 function zip(...) local args = {...} return coroutine.wrap(function () local t = {} for i, arg in ipairs(args) do local ff,tt,nn = ipairs(arg) t[arg] = {ff,tt,nn} end local is_end = fa…

メタテーブル

Lua

文字列型の値はデフォルトでメタテーブルが設定されている。また、メタテーブルとして、{__index=string}が設定されているので、stringに関数を追加すれば、それが文字列のメソッドとなる。 > print(getmetatable(1)) --数値にはメタテーブルが設定されてい…

EAFP

Lua

EAFPをするには、pcall()を使用する。 > function foo(arg) >> error('error message') >> return arg >> end > > isok, ret = pcall(foo, 99) --エラーが発生しない > print(isok, ret) false stdin:2: error message > > function bar() >> assert(false) …

zip関数

Lua

function zip(tbl1, tbl2) return coroutine.wrap(function () ff1,tt1,nn1 = ipairs(tbl1) ff2,tt2,nn2 = ipairs(tbl2) while true do i1, v1 = ff1(tt1,nn1) i2, v2 = ff2(tt2,nn2) if not v1 or not v2 then break end nn1 = nn1 + 1 nn2 = nn2 + 1 corou…

コルーチン

Lua

上記のメモした記事で、コルーチンでジェネレータを作成する場合に、coroutine.create()が使用されていて、使うときに、coroutine.resume()が使用されていたが、coroutine.wrap()を使用した方がもっと簡単に出来る。何故、coroutine.create()などを使用して…

メモ

Lua

Lightweight Language: Lua Programming (http://www.geocities.jp/m_hiroi/light/lua.html) 「Luaのオブジェクト指向」の記事は分かりやすかった。後でMix-inの記事も読むつもり。

for .. in 構文

Lua

Pythonでは、多値とリストとジェネレータが「for .. in 構文」では同一として扱える。しかし、Luaでは同一として扱えない。Luaでは、「for .. in _」の「_」の部分に、値を返す関数を必要とする。例えば以下のよう。 > function f() >> return 1 >> end > fo…

メモ

Lua

Luaプログラミング入門 (http://densan-labs.net/tech/lua/)

__lenのオーバーロード方法

Lua

__lenメタメソッドをオーバーロードするには、userdata型のオブジェクトでなくてはならない。 > assert(type(obj) == 'userdata') > meta = getmetatable(obj) > meta.__len = function(o) return 99 end > print(#obj) 99

strip関数とsplit関数

Lua

Luaにはstrip関数, split関数がない。以下はstrip関数。 function strip(s) return (string.gsub(s, "^%s*(.-)%s*$", "%1")) end 以下はsplit関数。 function split(s, delim) local is, ie local t = {} -- タブ・空白で分割 if not delim then for v in s:…

補助ライブラリの追加

Lua

1. まず補助ライブラリ自体のビルドLua for Windowsの中にあるgzioでテスト。以下からソースをダウンロードして展開。 https://github.com/jmaygarden/gzio 2. 展開したsrcファイルの中でDLLをビルド Luaの環境(lauxlib.h、lua.h、luaconf.h、lualib.h、lua5…

Cの配列のバインド

Lua

Cの配列をLuaのtableにバインドすると個数が分からなかったり、オーバーランする可能性がある。なので、1枚薄いWrapperをかませて、Lua側で調整する必要がありそう。以下のメタメソッドが参考になりそう。 入門Luaプログラミング第9章 Luaを拡張してみる(後…

exe化

Lua

1. 以下のサイトからlua-5.1.4のソースをダウンロードして展開 http://www.lua.org/download.html ・lua-5.1.4\srcフォルダに以下のファイルを作成 // main.c #include "lua.h" #include "lualib.h" #include "lauxlib.h" int main() { lua_State *L = lua_o…

tolua++によるクラスのバインド方法

Lua

1. 任意のフォルダを作成する ここでは、apple_eaterとする。 2. 必要なファイルを作成する。 apple_eater.cpp、apple_eater.h、main.cpp、apple_eater.pkg、apple_eater.lua 3. Luaから以下のファイルをフォルダにコピー lauxlib.h、lua.h、luaconf.h、lual…

メモ

Lua

LuaBookSupport (http://lua.mine.nu/w/LuaBookSupport)

組み込み用言語

Lua

以下のサイトで勉強中。 高速スクリプト言語「Lua」を始めよう! (http://www.hakkaku.net/articles/20081023-283) Lua (http://ar.aichi-u.ac.jp/blog/lua/lua.html) Luaは文法がJavaScriptに似てるだとか、構文がPascalに似てるだとか、実行速度が速いだと…

組み込み言語

Lua

Lua基礎文法最速マスター (http://handasse.blogspot.com/2010/02/lua.html) 主な言語まとめ (http://www.ruche-home.net/?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2F%C1%C8%A4%DF%B9%FE%A4%DF%B8%C0%B8%EC%2F%BC%E7%A4%CA%B8%C0%B8%EC%A4%DE%A4%C8%A4%…