Luaの基本構文
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 を使用します。
今回の記事は以上です。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン