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 とかの演算子もある。