Lua という言語について
まず最初に断り書きを。正しい定義は知らないが、とりあえず言語としての Lua を「Lua」と大文字から始めて書く。一方、ソフトウェア、およびコマンド名としては「lua」と小文字から始めて書くことにする。
今はちょっと忙しいので、実装を細かく見ている余裕がない。ので、最初からなんだが言語の話を書く。
lua をインストールすると、 lua コマンドと luac コマンド、および各種ライブラリやヘッダファイルがインストールされる。 Lua は組み込み用途の言語であるが、 lua コマンドは Lua の対話環境になっている。打ち込んだものをそのまま評価してくれる。 luac コマンドはバイトコンパイラである。バイトコンパイルしたものは lua コマンドからもライブラリからも利用できる。
lua は動的型言語のひとつで、変数には型はないが、値には型がある。値のもつ型はつぎの通り。
- 数
- 文字列
- nil
- 真理値
- 関数
- ユーザデータ
- スレッド
- テーブル
数は整数でも実数でも良く、 1 / 2 は 0.5 になる。文字列は "〜" か '〜' か、〜である。[[]]はネスト可能。 lua 5.1 から [==[〜]==]というタイプの記法が追加されたようだが、手元はまだ 5.0.2 なのでこれについては気にしないことにする。
nil はまだ値を持たないことを意味する。初出で値が代入されていない変数には nil が入る。true または false は真理値でそれぞれ真と偽を示す。ただし実際の条件においては false と nil が偽であり、それ以外のオブジェクトはすべて真として扱われる。
関数はファーストクラス値なので、ほかの変数とほぼ同様に変数に代入したりできる。というより、ほとんどの文脈で関数定義と「無名関数を定義して変数に代入」は同じことである。
スレッドは平行実行のためのツールである。コルーチンのために使われるもので、 pthread などのネイティブスレッドではない。
テーブルは、いわゆるハッシュテーブルに相当する概念である。 Lua には配列などのデータはなく、そうしたものはみなテーブルで表現される。オブジェクト指向でいうところのオブジェクトもテーブルになる。ちなみに、 a.abc は a["abc"] の構文糖衣だし、 a:abc(〜) は a.abc(a, 〜) の構文糖衣である。
ユーザデータは、主にユーザから渡されたデータ構造。
変数への代入は = を使う。
a = 1;
空の構文というのはないので ;; は文法エラー。改行するときはセミコロンは省略可
変数は利用されたところで新規に登録されるようだ。たとえば何もないところで、
> print(hoge);
とすると、 nil が出力される。つまりこの時点で hoge という変数が定義され、その値が nil になっている。上の a = 1 だと 1 が代入されるということだろう。ちなみに行頭の > は lua コマンドのプロンプト。
多重代入もできる。
> a, b = 1, 2; > a, b = b, a;
後者はaとbのスワップになっている。
数値の演算子はふつうに加減乗除(+-*/)や単項マイナスがある。ほかにベキ乗の^がある。数値演算は数か文字列でないと演算できない。文字列は数値に型を変換して演算する。つまり、 "1" + "1" は 2 になる。
文字列系の演算子は、文字列連結の .. くらい。
ほかに同値比較(==)とか <= とかの演算子がふつうにある。「等しくない」は~=。!=ではない。あと and とか or とかの演算子もある。