2011-05-01から1ヶ月間の記事一覧

ジェネリック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の記事も読むつもり。

クラスの機能に関して

クラスは以下の機能の複合体 a) 名前空間(+アクセス指定) b) マルチプルインスタンス c) ポリモルフィズム(or Duckタイピング) d) Mix-in c)とd)が継承機能で実現されることである。しかし、スクリプト言語などの動的言語であれば、Duckタイピングは普通に出…

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)