ひとり勉強会

ひとり楽しく勉強会

Luaソースコード勉強会 (2)

今回は Lua VM のメインループの実装を見ていこうと思います。思いました。まず最初に、Lua VMスタックの構造を把握してから・・・と思って始めたら長くなってしまったので、適当なところで次回に回します。^^

そういえば A No-Frills Introduction to Lua 5.1 VM Instructions というドキュメントを見つけました。luacの出力の逆アセンブラChunkSpy (http://luaforge.net/projects/chunkspy/) の製作者様によるまとめのようです。すばらしすぎる!!!こう、いろんなドキュメントが用意されてるのはいいですね、Lua

さて、第2回を始める前に、ちょっと予習。Lua使いの方にはとっても当たり前のことだと思いますけど、最初これができるの知らなくてわたし自身戸惑ったので、まとめておきます。Luaには多値(Multi-value)っていう概念があって

function foo(a,b,c,d)
  print(a,b,c,d)
end

function bar(a,b)
  return b, a
end

foo(1, 2, bar(3, 4)) -- foo(1,2,4,3) を呼び出す

こういうことができます。barが2つ値を返したものを、fooに3番目と4番目の別々の引数として渡してます。例えばRubyだと、barは実際には「2要素の配列」を返す実装になっていて、バラバラの引数とするには * で明示的に書くところでした。

foo(1, 2, *bar(3, 4))

この辺りがシームレスになってます。引数リストの最後と、returnの最後に関数呼び出しが来た場合には、複数の返値がバラされるみたいですね。それ以外の位置では1つめの返値だけが使用されます。

foo(bar(1,2), bar(3,4))  -- 表示は 2 4 3 nil

なので、引数とreturnリストの最後の要素だけは要注意です。予習終わり!