Sun, 24 Feb 2008

Luaと一ヶ月程戯れてみた感想

Luaを触りだして一ヶ月くらいたつので感想をメモ。 一言で言うと、 楽しい!! な んだけどせっかくなのでもう少し書いてみる。

入門Luaプログラミング

ASIN: 4797342722


多分5-6回読み返したかな。最初ピンとこなかった部分も何回か読むと、あぁそういうこ とねと理解できるところがありました。ただやはり入門編なので、そこのところをもうち ょっと詳しく、という部分が書かれていなかったので、ついカッとなって

Programming in Lua

ASIN: 8590379825


を買ってしまった。別に後悔はしてない。

で、pythonと比べていいところ、物足らない/不満なところを今の時点での感想として書 いてみる。

  • いいところ

    • シンプル、必要最小限の機能、拡張の容易さ

      本当に必要最小限しかないが、簡単にLuaレベルでもCレベルでも拡張できるので、必 要なものは自分で作る楽しさがある。次はどの機能を追加してやろうかな、と楽しみ ながら自分が使いたい機能を盛り込むことができる。

      Luaレベルでは、setmetatable()で、+やら-やら配列へのアクセスやら代入やらの動 作をoverrideできるし、モジュール(tableモジュールとかね)ヘ自分でメソッドの追 加もできるし、オブジェクト風のアクセスも可能。またCレベルではLuaとCとのスタ ックでの値の受け渡しさえ理解できれば自分で拡張できます。

      ※ 一応ライブラリ類も公開されているものがあって(LuaSocketとか)それを使うこと も可能ですよ。

  • 物足りない/不満なところ

    • end!end!!end!!!

      pythonで慣れちゃってるとやっぱりendが無駄な気がする。 もちろんthenやらdoやらも同じ。

    • 変数のスコープのデフォルトがglobalなこと

      いちいちlocal宣言しないとglobalスコープになってしまうこと。 うっかりブロック構文内の一時変数(のつもりのもの)でブロック外の変数を書き換え ちゃいそう。

    • 空文字列、空配列、0がif文の判定でfalseとして扱われないこと

      ついつい、if hoge then print("hoge") end とかしちゃうけど、hogeがnil/false以 外だとif文はtrue判定になってしまう。

    • テーブルは同じ値であっても別々のものが代入されるので t={}; print(t == {}) としてもfalseが返ってくること。

      空配列はif文でfalseとならないからといって、 t == {} では判定できない。こ の辺はちょっと直感的じゃないような気がする。

      仕方ないのでnext(t)がnilかどうかで判定している。

    • 未定義の変数も参照できる(nilが返ってくる)。ミスタイプしても気づきにくい。

      でもこれを変えちゃうと、言語仕様を色々変えないといけなくなっちゃうから無理かな。

大人数で開発する時にはこの辺のルールをちゃんと決めてからやらないとはまりそうな気がするな。

でも、pythonだとbuttery includedと言われるくらい最初から色々標準でライブラリがつ いてきて、それはそれで楽チンでいいんだけど、使いたい機能がなくって、じゃあ自分で どう実現しようかなって考えるのも(時間さえあれば)楽しくていいもんだな、と思います 。


Tue, 22 Jan 2008

luaの機能拡張

ある所でluaが使えないかな、とluaをひそかに勉強中。本当はPythonが使いたいんだけど ちょっと機能、サイズ的にでかすぎるかな。

入門Luaプログラミング

ASIN: 4797342722


luaはシンプルで、サイズが小さくて、実行速度も速いらしいし、なかなか書くのも楽しい。 ただし、標準ライブラリなりbuiltinsに相当するものが非常に少ない。table(listと dictionaryを合わせたようなの)と文字列とファイル入出力くらいしか使いたいのがない ので、ちょっと拡張しないと物足らない。

拡張用のライブラリとして( lua-users wiki: Libraries And Bindings )LuaSocketとか LuaSysとかあるんだけど、どうやって組み込んだらいいのかがまだよくわからない。

なので、まずはC言語で直接Luaのソースコードを修正してライブラリ関数を追加する方法 を試してみた。

とりあえずsysライブラリってことにしてみた。まだsleep()しか中身ないけど、下記のよ うに使います。

for i=1,10 do
  print(i)
  sys.sleep(2)
end

以下が、lua-5.1.2に対する差分。こんな感じで書けばライブラリが追加できるようだ。


Continue Reading...: "luaの機能拡張"