スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Lua 5.2.0 (alpha)が出た

最近になってwork5やらalphaやらalpha-rc2が…

前回Lua 5.2についての記事を書いたのはwork1の時だ。それ以来大きな変更があった。

前回書いたin-do-endは廃止されて、work3から_ENVが導入された。in-do-endだと環境テーブルを後から変更することができなかった。_ENVはただのローカル変数なので、好き勝手に変更でき、しかもテーブル以外の値を設定できる。あとこれに関連した変更:

  • グローバル変数の参照は_ENVを介して行われる。
    print(os.time())
    がこんなコードに変換される↓
    _ENV.print(_ENV.os.time())
    チャンクの先頭では_ENVが暗黙のローカル変数として宣言されるので、_ENV_ENV._ENVのように変換されることはない。
  • スレッドや関数は環境を持たない。
  • 関数は環境を持たないので、上位値を持たないC関数は新たなメモリ確保を必要としない(light C function)。light userdataと同じように、ポインタ一個で表されるようになったから。

モジュールシステムにも変更があった。

  • Lua標準関数の、moduleは非推奨になった。モジュールはグローバル変数を設定するな、ということらしい。
  • C APIのluaL_registerが非推奨になり、luaL_newlibとluaL_setfuncsが取って代わった。引数からモジュール名がなくなったが、一括して上位値を指定できるようになった(上位値で環境を代用するため)。
  • luaL_requiref追加。

ビット演算が、既存のライブラリと微妙に仕様が違っていて議論になったが、work5でライブラリ名がbit32に変更された。ついでに関数名もbit32.ANDみたいなのになった。関数名については目下議論中なので変わるかもしれない。

work1からのその他の変更(気づいたもの):

  • 比較演算のメタメソッドの仕様変更。
  • 文字列のパターンマッチのパターンに\0が使用可能に。これにより%zは非推奨。
  • 空文;;;;;;
  • io.linesの仕様変更。
  • lua_tonumberx追加

英語読める人はlua-users wiki: Lua Five Twoに目を通すといいと思う。

しかしあれだな、in-do-endは廃止されるし、ipairsは仕様が変わったと思えば(__ipairsがなければ__lenを尊重)、work3で一旦非推奨になり、work4では復活しまた仕様変更(__lenは見ない)があった。何がどうなるか分からんな。

スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

Luaのノウハウその3 - luaL_checkudataとその仲間たち

luaL_checkudata,luaL_newmetatable,luaL_getmetatableについて。 これらの関数は、Cのデータ型へのLuaバインディングを書く時に使われる。標準ライブラリではliolib.cとloadlib.cで使われている。 それぞれの関数の使い方については、リファレンスマニュアルにちゃんと載ってるのでそっちを参照。←丸投げ

典型的な使い方

  1. luaopen_xxxでluaL_newmetatableを呼び、メタテーブルを作る。必要なメタメソッドを登録する。
    luaL_newmetatable(L, "MyType"); // 作って
    luaL_register(L, NULL, funcs); // 必要なメタメソッドを登録
  2. 新しくユーザーデータを作る時に、メタテーブルを設定する。
    MyType *p = (MyType *)lua_newuserdata(L, sizeof(MyType));
    luaL_getmetatable(L, "MyType"); // レジストリからメタテーブルをとってきて
    lua_setmetatable(L, -2); // 新しく作ったユーザーデータに設定
  3. C関数中で、ユーザーデータからCポインタを得たい時にluaL_checkudataを呼ぶ。
    static int mytype_hoge (lua_State *L) {
      MyType *p = (MyType *)luaL_checkudata(L, 1, "MyType");
      // pでいろいろ
    }

FAQ

  • Q. スタックの指定した位置にある値が型tnameのユーザーデータかどうか調べたい。luaL_checkudataにエラーを投げさせたくない。
    A. luaL_checkudataのソースコードを参考にして自分で関数を書きましょう。Lua 5.2でluaL_testudataという関数が追加されるまでの辛抱です。

テーマ : プログラミング | ジャンル : コンピュータ

Lua 5.2.0 (work1)の雑感

思ったこと。

  • C関数から呼び出したLua関数からyieldできるようにする関係で、多少複雑になってしまった感じがする。出来なかったことが出来るようになった代償か。
  • バージョン(luaL_checkversion)は、本当に必要だろうか。バージョンが違ってたらそもそも実行できるのかという疑問が。
  • lua_cpcallの代用が面倒。1行のコードが4行に。ただしポインタ以外のものも渡せるのはいいかもしれない。
  • 非互換が多過ぎる。しかも互換オプションはデフォルトで無効な上に、LUA_GLOBALSINDEXのように跡形もなく消えたものもある。

もちろん、これは最初の作業バージョンだから、正式リリースまでには全く違うものになっているだろう。非互換が多過ぎると書いたけど、互換オプションがデフォルトになる見込みは十分にある。

しかしLua 5.1 (work0)が2004年3月で5.1の正式リリースが2006年2月。 Lua 4.1のスナップショットが2001年5月、Lua 5.0 (work0)が2002年6月で5.0の正式リリースが2003年4月。 ということは正式リリースはまだまだ先だな。

まとめ:今から心配したってしょうがない。でもできるだけ追い続けていよう。

テーマ : プログラミング | ジャンル : コンピュータ

Lua 5.2.0 (work 1) が公開された

Lua 5.2.0の作業バージョンが公開された。
MLの投稿:[ANN] Lua 5.2.0 (work1) now available

変更点などは自分で確認しよう。以下は(ほんの)一部。

  • 言語
    • in-do-end (Lexical Environments)
      みんなで使いどころを考えてやりましょう。
      in {myprint=print} do
      myprint("Hello world")
      end
      
      要はsetfenvでやっていたことの代替。そしてさようならget/setfenv。
    • \xHH
  • ライブラリ
    • setfenv/getfenvの廃止
    • ビット演算
    • table.packの追加
    • unpackはtable.unpackに移動
    • debugライブラリはrequire()でロードしてね
  • CのAPI
    多過ぎな気がするので書きません。

テーマ : プログラミング | ジャンル : コンピュータ

XML形式のプロパティリストをLuaから読み込む

Macで使われている、XML形式のプロパティリスト(.plist)を読み込む必要があったので、Luaで読み込むコードを書いた。LuaExpat使用。

これってJSONとかYAMLと一対一の変換が出来そうな仕様だなぁ。

テーマ : プログラミング | ジャンル : コンピュータ

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。