1. ホーム
  2. スクリプト・コラム
  3. ルア

Luaの基本構文

2022-02-11 06:18:31

1 はじめに

ホストプログラムから呼び出される必要があり、C関数をインジェクトすることができます。

2 構文上の規則

Luaの構文は、BNF構文規則に基づいています。

Luaは大文字と小文字を区別します。

2.1 キーワードの保存

Cにないキーワードは

コピーコード コードは以下の通りです。

and elseif function
in nil local not or
repeat then until

仕様です。グローバル変数はアンダースコアで始まる。

2.2 演算子

C言語では利用できない演算子。

^
~=
// -- 切り捨て
Luaでは使用できない演算子です。

+=
-=

2.3 文字列の定義

エスケープを使う:あいまいな文字をエスケープして表現する

文字表現

a -- 文字 a を表します。
\ʕ-̫͡-ʔ
\数字 "1 "を表す。
その他のエスケープ文字は以下の通りです。

\\n          -- は文字列 \n を表します。
\Ίταμμα ταμμα ταμμα
なお、数値は3桁でなければなりません。その他の文字は3桁以上にはできません。

長い括弧を使う:長い括弧の中はすべて通常の文字として扱われます。

[[]] -- レベル0長括弧
[ ==[]==] -- レベル2の長かっこ

3 値と型

Luaは動的言語です。変数には型がなく、値には型があります。値はそれ自身の型情報を持っています。

Luaには、nil、boolean、number、string、function、userdata、thread、tableの8つの基本的なデータ型があります。

nil と false のみ条件が false になり、その他はすべて true になります。

userdata型の変数は、C言語のデータを格納するために使用されます。Luaはこのタイプのデータしか使用できず、作成も変更もできないため、ホスト・プログラムがデータを完全に制御することができます。

thread はコルーチンを実装するために使用されます。

tableは、連想配列の実装に使用されます。tableは、任意の型のデータをインデックス化し、任意の型をテーブルフィールド(上述)の値にすることができます。
任意の型にnilは含まれない)。tableはLuaで唯一のデータ構造です。
関数は値でもあるので、関数はtableに格納することができます。

function、userdata、thread、tableはすべてオブジェクトである値のタイプです。これらのタイプは変数への参照を保持するだけで、代入、引数渡し、関数からのリターンなどの際に、いかなる性質のコピーも作りません。

ライブラリ関数 type() は、変数の型記述を返します。

3.1 強制的な変換

Luaは数値と文字列の自動変換を行います。
数値から文字列への変換を制御するために、format 関数を使用することができます。

4 変数

変数には、グローバル変数、ローカル変数、テーブルのフィールドの3種類があります。

関数外の変数は、ローカル表示で宣言されていない限り、デフォルトでグローバルです。関数内の変数と関数への引数は、デフォルトでローカルです。

ローカル変数のスコープは、宣言の開始から宣言されたブロックの終了まで(または次に同じ名前のローカル変数が宣言されるまで)です。

すべての変数のデフォルト値はnilです。

コピーコード コードは以下の通りです。

a = 5 -- global variable
local b = 5 -- local variable
function joke()
    c = 5 -- local variable
    local d = 6 -- local variables
end
print(c,d) --> nil nil
do
    local a = 6 -- local variable
    b = 6 -- global variable
    print(a,b); --> 6 6
end
print(a,b) --> 5 6

便利なマーカー、-->は直前の式の結果を表す。

4.1 インデックス

テーブルインデックスには角括弧 [] を使用します。

t[i]
t.i -- インデックスが文字列型の場合の簡便な書き方
gettable_event(t,i) -- インデックスアクセスを使用する場合、基本的には以下のような関数呼び出しになります。

4.2 環境テーブル

すべてのグローバル変数は、変数名_envの環境テーブルに配置されます。グローバル変数aへのアクセスは_env.aです(_env_は説明のためだけのものです)。

各関数は、その関数が呼び出すことができるすべての変数を含む環境テーブルへの参照を変数として保持します。
子関数は親関数から環境テーブルを引き継ぎます。
環境テーブルの読み書きを行うには、関数 getfenv / setfenv を使用します。

今回の記事は以上です。