Lua の復習とかしてみる その 2

2.1

if 文の書き方。普通の構文。
「≠」は「 ~= 」と書く。

if bool1 then
  --  処理 1
elseif bool2 then
  --  処理 2
else
  --  処理 3
end
2.2

while ループ。

while bool1 do
  if bool2 then
    break
  end
end

for ループ。
ここで宣言している i のスコープは for の中だけ。

for i = 1, 10 do  --  for i = 1, 10, 2 do って書き方とかも出来る
  print(i)
end

repeat-until 文。
C/C++ で言うところの do-while 文。

repeat
  --  何か処理
until bool
2.3

配列の話。

  • Lua の配列は table の特別な形。
  • ちなみに可変長。宣言時に要素数を書く必要がない。
  • Lua の場合、配列のインデックスは 1 から始めるのが通例。
  • 存在しない要素にアクセスした場合、 nil が返る。
  • 配列の要素数は table.getn(テーブル名) で得られる。(配列のインデックスの最大値が得られる)
2.4

boolean の話。

  • not 演算子で論理値の反転。
  • 論理積は and 、論理和は or で取れる。
  • Lua では false と nil 以外の値は全て「真」。空文字列、空テーブルも真。
  • or はデフォルト値を設定するのにも使える。
2.5

合計を求めるプログラム。
本のサンプルをここまでの知識を使って微妙に改造。

list = { 310, 260, 270, 440 }
sum = 0
for i = 1, table.getn(list) do
  sum = sum + list[i]
end
print(sum)

配列の 0 番目の要素にアクセスしようとしてて、なかなか動かなかったということは内緒。つい数分前に読んだ Lua の配列の通例の話をもう忘れているとかアホ過ぎる。
ちなみにこんな感じのエラーが返ってくる。

lua: 2_5.lua:4: attempt to perform arithmetic on field '?' (a nil value)

*追記
上のエラーなんだけど、気になって再現してみようと思った。
でも 0 番目の要素にアクセスしようとしても nil が返ってくるだけで、その後の処理はちゃんと動くね。
何が原因のエラーだったんだろう。
今となってはエラーを吐いたコードも存在せず、エラーの原因を追いようがない。
ありそうなのは文字コード絡みのエディタのバグかなぁ。
OCaml で遊んでたときもなったことあるし。

Lua の復習とかしてみる

Lua の復習と雑多なメモ。多分参考にはならないと思うけど、ログとして書いてみる。
テキストには、上野豊「入門 Lua プログラミング」を使用。

1.1

スクリプト言語の紹介。
Lua がどんな分野で使われているかとか。
ちなみにゲームソフトへの組み込みが多いらしい。 WoW とか RO とか。

1.2 Lua の特徴
    1. 少ない知識でプログラムを組める
    2. 動作が軽い
    3. データが整理できる

上の 2 つは Lua の大きな特徴として有名だけど、3 番目の「データが整理できる」ってなんだっけ?
本文を読むと

データをうまく表現することによって、その内容を整理していくのに役立ちます。

とあるから、データ構造のことかな。テーブルの話と関係がありそう。

1.3

変数の話。
よくある動的言語の変数の使い方と一緒。
標準出力?に出力するためのメソッドが出てきたので、一応例を載せておく。

num = 5
print(num)
1.4

プログラムの実行の仕方。

1.5

文字列データの扱い方。
多分忘れるのでメモ。

dvd = "DVD player"
cd  = 'CD player B\' extra'
md  = 'MD "wantman"'
mp3 = [[Bpple's jPod "klassic"]]
  • 引用符で囲んだ文字列は、途中で改行するとエラーになる
  • 二重角カッコで囲んだ文字列は、途中で改行すると改行も文字列に含まれる

らしい。
やってみよう。

linebreak1 = [[line1
line2
line3]]

linebreak2 = [[
  foo
    bar
      fizz
        buzz
]]

print(linebreak1)
print(linebreak2)
% lua kakko.lua
line1
line2
line3
  foo
    bar
      fizz
        buzz

おお、本当だ。

1.6

コメントの書き方。

kingaku = 200  --  一行コメント
--[[




]]--
1.7

プログラムの実行単位の話。
文、ブロック、チャンク。

1.8

ついに来ました、テーブルさん。

cdplayer = { name = "cd player B", maker = "awawa",
             price = 10000, shop = "atom" }
print(cdplayer.name)

各要素には「テーブル名.フィールド名」の形でアクセスする。
データは何でも置けるんだったかな。忘れた。

modf のこと

double modf(double x, double *iptr);

この関数って何で整数部分を double に格納するんだろ。
自分で使ったことないから具体的な例が思い浮かばないんだけど、その後の計算に便利だったりするのかな。
と思ったんだけど、 NaN が返ってくる可能性があるからか。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/modf.3.html
NaN - Wikipedia

ああ、そういえば

WM7 の開発環境って SilverlightXNA らしいですね。
どっちも覚える気がなかったから多分勉強しない。
野良アプリも禁止っぽいし。 Marketplace も面倒だし。


iPhoneマルチタスクに対応するかも、とかって話になっているのに、 WM のアドバンテージだったマルチタスクを捨ててしまったあたりもなぁ。実用的だったかどうかは別の話だけど。


どれもユーザ視点だと悪い選択ではないんだよね。
開発者視点だと最悪だけど。
一応開発環境が無償で手に入れられるようになったのが唯一の救いかな。

pvtrace のソースコード

パッと眺めた感じ、 pvtrace のソースは非常にシンプルなので、コードリーディングの入門用の題材としてはオススメかも知れない。
でも、あくまでも入門用としてオススメなだけで、読んでて勉強になるわけじゃないと思った。

グラフィカルなコールグラフを使いたくなった

ので、 pvtrace と graphviz をインストールした。
これが一番面倒くさくなさそうだったので。


参考リンク
Graphviz - Graph Visualization Software
Graphvizによるファンクション・コールの視覚化
http://www.marv.mediatti.net/~molelord/477261706876697AA4C7BBEBB3D0B2BDA1A2A4CECAE4C2AD.html
C++で関数呼出しを視覚化 コールグラフを出力してみよう - higepon blog