lua で Y コンビネータ

lua

ところで lua で Y コンビネータを書いてみた。 function Y(f) return function(a) return f(Y(f), a); end; end f = Y(function(f, n) if n <= 0 then return 1 else return n*f(n-1); end; end) f(10) # => 3628800ふむふむ。これを複数引数にするにはどう…

ldo(2) 返り値

lua

さて、 luaD_call に戻る。 firstResult が NULL でないとき、つまり C 関数のときは、各個の C 関数が適切な処理をしてくれるわけでこちらは関知しなくてよい。そうでないときは luaV_execute を実行するが、これも考えなくてよい。おおむね、 CallInfo に…

ldo

lua

lua の関数呼出しを受け持つのが luaD_call である。しかし、細かいエラー処理を除くと、実際には luaD_precall を実行し、 luaD_poscall しているにすぎない。そのあいだに、 luaV_execute で実際の関数のコードを呼び出しているが、これは lvm のときまで…

ステート(続)

lua

さて、次は ldo に進もうかと思ったが、その前に lua_State の構造の理解が必須だと思ったので先にそれを解説する。先週は lua_State の初期化を見た。今週はまず、 lua_State の内部データを眺める。 struct lua_State { CommonHeader; StkId top; /* first…

ステート

次はメモリ管理に進もうかと思ったが、読みすすめていくうちに、どうも lua_State の使い方を見ないと正しく理解できないのではないかと思った。そこで先に lstate を見て lua_State に簡単に触れる。次に ldo を見て lua のコールスタックの使い方を見る。…

関数

lua では関数もファーストクラス値だった。型は次のようになっている。 #define ClosureHeader \ CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist typedef struct CClosure { ClosureHeader; lua_CFunction f; TObject upvalue[1]; } CClos…

Lua 論文について

http://www.radiumsoftware.com/0604.html#060407 で紹介されていた論文で、テーブルまわりのことはだいたい説明したように書いてあったことを付記しておく。っていうか先に論文を読めという感じですか。この先登場するであろうVM命令の説明とか、 Upval の…

lua のお勉強[5]

先週は微妙に忙しかったのと、 GC まわりをどうしたものか悩んでいて書けなかった。

next

さて、あと ltable.c で見ていない関数は luaH_next だ。これは lua の next 関数に対応する(API の lua_next はけっきょく luaH_next を呼んでいる)。 next は、引数としてテーブルとインデックスを取る。インデックスを省略すると「最初の」キーと値のペア…

ltable [2] テーブルに値をセットする

セット系の関数は次の2つ。 TObject *luaH_set (lua_State *L, Table *t, const TObject *key) { const TObject *p = luaH_get(t, key); t->flags = 0; if (p != &luaO_nilobject) return cast(TObject *, p); else { if (ttisnil(key)) luaG_runerror(L, "t…

ltable

テーブルは Lua の最も重要なデータ構造だ。というか、コレクションタイプのデータ構造をこれしか持たない(配列とかは Lua にはない)。さて、ヘッダファイルを見ると、 luaH_ なるプレフィクス(Hはハッシュ表の H だろう)を持つ関数たちが用意されている。ま…

lstring の補足

ところで先週書きながら「これ、文字列が書き変わったらどうなるのだろう」というのが気になっていた。のだが、 Lua の言語仕様上、文字列は immutable なのだね。したがって、文字列が書き変わることはない(newstr内でコピーしているから、 Lua のあずかり…

どうでもいいが

(())な「脚注記法」は pre 中でも有効なのか。そういうもんか?

lstring

lstring は文字列を取り扱っている。まずヘッダファイルを見てみる。たとえば次の定義は文字列の長さを計算するものであるようだ。 #define sizestring(l) (cast(lu_mem, sizeof(union TString))+ \ (cast(lu_mem, l)+1)*sizeof(char))cast というのはマクロ…

lobject

まず、 lobject.h を見ると、ここにはたくさんの型定義が書かれている。 lua のデータオブジェクトを表現するのは次の型宣言。 typedef struct lua_TObject { int tt; Value value; } TObject; TObject は「タグつきオブジェクト」の意。 tt がタグ、 Value …

lua のファイル

さて、言語の詳細をあんまり詳しく解説することは目的ではないので次に進む。lua の実装にはどれくらいのプログラムが関わっているかというと次のようになっている(このほかに lua コマンド実装の lua/* と luac コマンド実装の luac/*、各種ライブラリの li…

コルーチン

ところで Lua の言語的な特徴は「なんでもテーブル」ということかと思ったら、あとコルーチンもあることを知る。コルーチンを作るのには、 関数を用意し、 coroutine.create でコルーチン化し、 coroutine.resume で実行、 コルーチン内では coroutine.yield…

ローカルスコープについて

luaの挙動の話は前回でおしまいの予定だったが、補足が2件ほどあった。ひとつめがローカルスコープと関数の扱い。local 宣言について先週は「そこで新たにローカルスコープを作る」というタイプの表現をしたが、どちらかというと、「ある種の操作では自動的…

Lua の wiki

2ch の Lua スレを見ていたら、 Lua など、C言語に組み込んで使うタイプのスクリプト言語の wiki が立ち上がった。 http://wikiwiki.jp/lua/っていってもまだ何もないみたい。この文章は2週目にして飽き気味。三日坊主は避けたい。

変数のスコープ

レキシカルスコープ a = 1 function f(x, y) return(x+a, y+a) end print(f(1, 2)) # => 2, 3 a = 2 print(f(1, 2)) # => 3, 4 また、 local 宣言でローカルスコープを積むことができる。ただしローカルスコープの終端が決定できないので、積むときには do l…

制御構文

while ループ。 while 条件 do ブロック end until ループ repeat ブロック until 条件; for ループ for i = 0, 10, 2 do print(i); end 0が初期値、10が終端値、2がステップ。ステップを省略すると1。テーブルにアクセスする場合には、 for i, v in ary do …

関数

関数は function () 〜 end で定義する。 function (a, b) return a + b end 具体的な関数定義は、 function f(a, b) return a + b end のように名前を書くが、これは f = function (a, b) return a + b end と同じこと。関数呼出しはC言語と同じような感じ…

Lua という言語について

まず最初に断り書きを。正しい定義は知らないが、とりあえず言語としての Lua を「Lua」と大文字から始めて書く。一方、ソフトウェア、およびコマンド名としては「lua」と小文字から始めて書くことにする。今はちょっと忙しいので、実装を細かく見ている余裕…

趣旨

この日記はずっと放置していたのだが、最近になってちょっと勿体無い気がしてきた。ので何かをやろうと思いついた。何をするか、というネタもないではないが、とりあえず思いついたところで Lua の勉強をすることにする。http://www.lua.org/Lua は組み込み…