今日やったこと
これだけ。
もうちょい何かやりたかったなー。
入門 Lua プログラミングを 1/3 くらい読んで(読み返して)、さらに手を動かして思ったんだけど、 Lua ってプログラミング未経験者の初めてを奪う言語として結構いい感じなんじゃない?
C/C++ みたいな不可解さは特にないし、 Java みたいな巨大さもない。
Linux なら apt-get か yum でインストールも簡単にできるし、 Windows でもパスを通すことくらいしか壁がない。
まぁちょっと大変なことをやろうと思うと C/C++ に降りて行かなきゃならないのがアレだけどねー。
OCaml も悪くなさそうなんだけど、入門段階すら終える前に放置してしまったので何とも言えないな。
OCaml の勉強の続きは近いうちに必ず始めるよ。これは未定とか予定じゃなくて決定事項。
やっぱ関数型言語はちゃんと理解したいです。 Lisp 怖いとか感じなくなるようになりたいです。
Lua の復習とかしてみる その 4
ようやく第 2 部に突入。
5.1
カード型データベース。
5.2
テーブルの配列。ハッシュの話ですね。
テーブルの要素へのアクセスの仕方。
player = { name = "abc" } player2 = { name = "foo" } player3 = { name = "bar" } members = {} members[1] = player members[2] = player2 members[3] = player3 -- とすると print(members[1].name) print(player.name) -- どちらも同じ物を参照するようになる
5.3
テーブルのフィールドを追加する話。
2 つ目のやり方を使えば予約語もフィールド名として使える。やらないほうが良さそうだけどね。
player = { name = "abc" } player.age = 20 player.["shoot"] = 1
まぁ当然と言えば当然だけど、 Lua の場合でも連想配列よりも通常の配列のほうが処理効率が高いらしい。
プログラマは配列と連想配列を区別して考える必要はあまりないけれど、 Lua の内部処理はちゃんと区別されていますよって話。
5.4
2 次元配列。
C の宣言と同じような感じ。テーブルの中にテーブルを持たせるって感じで書くのかと思ったけど、割と普通だね。
配列の長さが自由に変えられるからやってしまいそうだけど、下みたいな書き方は出来ないみたい。
mtx = {} mtx[1] = {} mtx[1][3] = 1 -- ok mtx[2][1] = 2 -- error mtx[2] が用意されてないからダメ
5.5
テーブルのデータ処理。関数にテーブルのフィールド名を渡す方法。
function testPrint(array, field) for i = 1, table.getn(array) do member = array[i] print(member[field]) end end array = { { number = 1 }, { number = 2 }, { number = 3 } } testPrint(array, "number")
なんかあからさまにサンプルですって感じの微妙なコードだな。まぁいいか。
注意点。
変数を事前に宣言をする必要がないという便利さとのトレードオフで、スペルミスが素通りされる危険がある。
上の例みたいな単純なコードならすぐに気づくけど、いくつかの変数を扱う場合は結構やりがちなミスだよね。
5.6
コンストラクタの話とテーブルのメンバに関数が入れられるよって話。
さらっと書いたけど、これは結構重要だな。
多分この辺のことを指して「 Lua はオブジェクト指向言語モドキとしても使える」って話があるんだろう。
5.7
ソート。 table.sort() という関数があり、これに数値の配列を渡すと昇順にソートしてくれる。
table.sort() には 2 つ目のパラメータとして比較関数を渡すことが出来る。これによって降順にソートできる。
まぁだいたい C とかと一緒だね。
んで、 Lua 特有の話で、テーブルを渡した場合、比較関数を使って比較するフィールドを指定してやる必要がある。
5.8
文字列のソート。
ASCII 順にソートされる。大文字小文字を区別したくない場合は string.upper() か string.lower() を使って比較する前に揃えてあげる。
5.9
データベースというかテーブル内の検索。
5.10
テーブルの走査。
汎用 for ループktkr!
test = { name = "foo", str = "bar", num = 1 } for key, val in pairs(test) do out = string.format("%-10s%s", key, val) print(out) end
while ループでも next() を使うことでほぼ同様のことが出来る。
test = { name = "foo", str = "bar", num = 1 } key, val = next(test) while(key) do out = string.format("%-10s%s", key, val) print(out) key, val = next(test, key) end
特に理由がなければ for と pairs() の組合せを使うのが無難。
while と next() のほうは、 2 つの next() が離れてしまうので可読性が落ちるから、ってことらしい。確かにそうかも知れない。
今日やったこと
新しいことをやれてない。金曜日ともなるとさすがに疲れが出てくるね。
体力付けないとなー。
「コンピュータ・アーキテクチャのエッセンス」が全然読めてないことを思い出した。っていうか絶対復習に思い出させられた。
今期の大学の講義で「コンピュータ・アーキテクチャ」ってまんまの名前の似たような講義もあるし、出来れば定期考査までに一通り目を通したい。
ちなみに昨日は実験という名の実習があったので復習すらしませんでした。Java も少し勉強しないとな。
薬袋善郎「英語リーディング教本」を買ったので来週か、来月辺りから英語の勉強を再開したい。
最近は意味の理解できないまま Grammar Girl を聴くってことくらいしかしてなかったからリハビリにちょうど良さそう。
やっぱリーディングも重要だよな。そもそも僕の場合は会話よりも読み書きの力のほうが重要なわけだし。
とはいえ、リスニングの訓練はなかなか楽しいと思う。聴けば聴くほど聞き取れるようになる。しかし、ボキャブラリーの貧弱さのせいで内容が理解できないという罠。いやより正確に書くならば、知識としての単語と実際に発音されている単語の音が結びついていないせいで瞬時に理解できない罠。
これに関してはカタカナ英語の法則を復習するとか単語帳の CD を聴き込むなどしてイメージを修正・矯正していく他ないだろう。
目で読んでも意味の理解できない文をディクテーションやシャドウイングするって結構苦痛だよね。ってことに気づいたのはある意味進歩か。
っつーわけで Grammar Girl は結構オススメの podcast ですよ。初めは僕好みな声だから聴き始めただけなんだけど、意外と訓練になってるみたい。電車なんかで native speaker らしき外人の会話が聞き取れると結構嬉しい。
Lua の復習とかしてみる その 3
3.1
関数呼び出しの話。
特に書くことなし。
3.2
関数の定義の仕方。
function という予約語を使うみたい。下は受け取った配列の合計を計算する関数。
function goukei(array) sum = 0 for i = 1, table.getn(array) do sum = sum + array[i] end return sum end
3.3
ローカル変数の話。
Lua は関数定義の中で作った変数がグローバル変数になるらしい。恐ろしい。
だから関数外部からアクセスできないようにするためには local という記憶域クラス指定子っぽい物を付ける必要がある。
だから上の関数の定義をより安全に書くためには下みたいな感じ?
function goukei(array) local sum = 0 for i = 1, table.getn(array) do sum = sum + array[i] end return sum end
これで外部から sum に直接アクセスできないようになった。確認した。
3.4
文字列の処理の話。
連結演算子なんてのがあるらしい。なんで演算子になってるんだろ。関数で良くね?
a = "foo" b = "bar" c = a .. b print(c)
まだまだあるよ、string の関数。
test = "foo bar hoge hage" print("元の文字列 : " .. test) result = string.sub(test, 3, 7) -- 切り出し print("3 〜 7 文字目 : " .. result) istart, iend = string.find(test, "hoge") -- hoge の開始位置と終了位置のインデックスを返す print("hoge の位置 : " .. istart, iend) result = string.upper(test) -- upper ですね print("大文字に変換 : " .. result)
他にもまだまだいっぱいあるけど、今はさすがに書かないよ。
あとで出てくるよ。
3.5
文字列の書式の話。
string.format() というのを使う。ほぼ C の printf と一緒の書式。
4.1
3.4, 3.5 に引き続き、文字列ライブラリの話。
ここは主に検索と置換かな。
string.gmatch() って関数はイテレータ関数らしい。
他の関数の話も出てきた。
小さな言語と言っても、文字列処理の関数の有名どころはだいたい揃ってるみたい。
文字コードの話も出てきた。
string.find() が出てきたときも思ったけど、複数の返り値を返せるのが面白いね。
エスケープシーケンスの話も出てきた。この節は話題が広いな。
エスケープシーケンスは他の言語とだいたい一緒だね。
と思ったら、ヌル文字は解釈されずにそのまま出力するらしい。
やってみよう。
test = 'hoge\0hage' istart, iend = string.find(test,"hage") print(istart, iend)
結果
% lua escape.lua 6 9
確かにヌル文字のあとの文字も扱えてるな。
普通に print すると途切れちゃうみたいだけど。
4.2
みんな大好き正規表現のお時間がやってまいりました!まぁサラッと通過しますけどね。
一つだけ気になる点がある。
なんでメタ文字のエスケープが % なんだろ。 \ だと何か問題あるのか?
この仕様は気になるなー。あとでもうちょっと調べてみよう。
4.3
文字列のキャプチャの話。
キャプチャってなんだ、と思ったら、
パターンにマッチした文字列の一部分を後で利用できるように保存しておくことです。
ってことらしい。
ほぼサンプルのまんまのコードが下。
string = "no. AB1234 is now available." captcha = string.gsub(string, "(AB)(%d+)", "%1-%1-<%2>") print(captcha)
4.4
単語の切り出しの話。
クロージャktkr!
写経するのにちょうど良い長さなので写経した。
4.5
強制変換の話。英語で書くと coercion らしい。
数値と文字列の間のキャストだね。
4.6
テーブル操作ライブラリの話。
これも文字列ライブラリ同様、基本的な関数は揃ってるっぽい。
ちゃんと table.foreach() があるあたりに安心感を覚えた。
4.7
Lua の入出力ライブラリは、 C の stdio の拡張らしい。ラッパー?
io.input(filename) で入力ファイルとのストリームを開く、 io.read() で 1 行読み込み、io.input() でストリームを閉じる。
出力操作も似たような感じ。
read も write も改行文字は含まないのか。自分で連結してやる必要があると。
io.open(filename, mode) で C の fopen みたいな使い方が出来る。このときのデータ読み込みは file-handle:read(formats) ってので指定してやる。file-handle の部分は変数。メソッド呼び出しみたいな感じだね。
4.8
数値計算ライブラリの話。このライブラリも良く使う関数は揃ってる。
4.9
OS ライブラリ。 OS の機能を Lua から使うときに呼び出す関数群。
os.time() とか。
4.10
標準ライブラリを使った大きめのサンプル。
特に問題ないかな。
というわけで第 1 部完。
今日やったこと
久しぶりの今日やったこと
入口からの超入門は解りやすくて面白かった。電卓と計算機の違いから始まり、プログラムの構造(分岐とか繰り返しとか再帰とかね)の強力さを紹介しつつ、初心者にも分かりやすい気の利いたやり方(アルゴリズム)をサラサラッと紹介していく感じの本。
系統的に勉強するための本じゃなくて、アルゴリズム界隈のガイドツアーって本かな。
最後は計算幾何学まで行っちゃう辺りが恐ろしいというか、ハマっちゃった人は残念ながらアルゴリズム界隈に住むことになってしまうわけだよね。いや残念かどうか知らないけど。
あ、ちなみに僕は計算幾何のところは難しくて全然理解出来てないです。すいません。
ぼちぼち Programming in Lua が欲しいなぁと思い始めた。
だがしかし、なぜか「入門 Git 」を買った僕。
全然「なぜか」でも何でもなくて、欲しかったから買ったんだけどね。