このドキュメントは、LuaがLua 5.3 リファレンスマニュアルで説明されているように、Luanがどのように異なるかを説明します。
Luaは利用可能な最もシンプルな言語の一つですが、Luanはさらにシンプルです。 これは、Luanが追加するよりも多くを削除することを意味します。 追加されるもののほとんどは、言語自体ではなくライブラリに追加されます。
LuanはJavaで実装されており、Javaと緊密に統合されています。 これにより、Javaの優れたスクリプト言語となります。
LuanはLuaにはないバイナリ型を追加します。 これは、Luaの文字列がバイナリを表現できるのに対し、Luanの文字列はできないためです。
LuanのNil型はJavaのnullとして実装されています。 LuanのBoolean型はJavaのBoolean型として実装されています。 LuanのNumber型はJavaのNumber型として実装されています。 LuanのString型はJavaのString型として実装されています。 実際の数値はJavaのNumberクラスの任意のサブクラスである可能性があります。
Luanの関数はLuanで書かれるか、ネイティブJavaメソッドのラッパーである可能性があります。 任意のJavaメソッドはLuanの関数として呼び出すことができます。
Luanのjava型はLuaのuserdataの代替です。 Luanのjava値は、他の認識された型のいずれにも該当しないJavaオブジェクトにすぎません。
Luanのバイナリ型はJavaのbyte[ ]型で、バイトの配列です。
Luanのテーブル型はLuaの同等のものと同じですが、Javaで実装されています。
LuanにはLuaのスレッド型がありません。これは実際にはスレッドではなく、実際にはコルーチンです。 Luanには実際のスレッドがあります。 これは、各リクエストがスレッドによって処理されるWebサービングに特に価値があります。 しかし、スレッドの同期はアプリケーションプログラマーには複雑すぎます。 したがって、Luanは可変オブジェクトを複数のスレッドからアクセス可能になると不変にします。 これにより、スレッドの同期の必要がなくなります。 スレッド間で可変状態を共有する必要がある場合、これには特別な関数があります。
Luanにはグローバル環境がまったくなく、_Gもありません。 デフォルトでは、Luanは_ENVも定義しませんが、チャンク内でローカルテーブルとして定義すると、Luaと同様に動作します。 _ENVが定義されていない場合、グローバル変数はなく、認識されない変数名はコンパイルエラーを生成します。
すべてのモジュールは1つのローカル関数requireで初期化されます。 モジュールはこの関数を使用して必要なものにアクセスします。
Luanには関数errorがありますが、pcallやxpcallはありません。 代わりにtry文を追加します。 Luanのエラーはメッセージオブジェクトではなく、エラーテーブルとして実装されています。
Luanはテーブルにのみメタテーブルを持ち、他の型には持ちません。
Luanはcallメタメソッドをサポートしていません。 callメタメソッドでできることは、クロージャを使用してよりクリーンに行うことができるため、これは省略されました。
LuanはJavaのガベージコレクションを使用します。 Luanには特別なガベージコレクションメソッドはありません。
Luanにはまだ弱いテーブルはありませんが、これが追加されます。
Luanにはコルーチンがありません。 コルーチンはシンプルな言語には必要ない複雑な概念であるため、省略されました。
Luaとは異なり、Luanは行の終わりを文の終わりと見なします。 これにより、エラーをキャッチし、可読性が向上します。 別の行で文を続けたい場合は、バックスラッシュと改行を使用して空白として扱うことができます。
LuanはLuaと同様のキーワードセットを持ち、他の字句規則も同じです。
デフォルトでは、グローバル変数はなく、未定義の変数はコンパイルエラーを生成します。 グローバル変数を有効にするには、_ENVを定義する必要があります。 グローバル変数を避けることで、コンパイル時にエラーをキャッチしやすくなります。
Luanはブロック終端子end_do、end_for、end_function、end_if、end_try、end_whileを追加します。 これらは適切なブロックタイプを終了するために使用できますが、endも任意のブロックを終了するために使用できます。
Luanのほとんどの文はLuaと同じです。 異なる文のみがここにリストされます。
Luanのif、while、repeat文は、条件式がブール値を返す必要がある点を除いて、Luaと同じです。 他の値の型はエラーを生成します。 これにより、エラーをキャッチし、コードの可読性が向上します。
Luanはループ内で使用されるcontinue文を追加します。
Luanにはgoto文がありません。
Luanには数値for文がありません。 Luanにはジェネリックfor文のみがあります。 数値for文の代わりに、Luanはジェネリックfor文でrange関数を使用します。次のように:
for i in range(from,to,step) do block end
Luanのジェネリックfor文は、Luanが式のみを使用し、explistを使用しないため、Luaバージョンよりもシンプルです。 したがって、次のようなfor文は:
for var_1, ···, var_n in exp do block end
次のコードと同等です:
do
local f = exp
while true do
local var_1, ···, var_n = f()
if var_1 == nil then break end
block
end
end
Luaとは異なり、Luanにはtry文があります。 LuanリファレンスマニュアルのTry文を参照してください。 これにより、LuanにはLuaのpcall関数が不要になります。
Luaとは異なり、Luanはorおよびand式を単独の文として許可します。 これは次のような場合に便利です:
x==5 or error "x should be 5"
テンプレート文はLuaには存在しないLuanの追加です。 Luanリファレンスマニュアルのテンプレート文を参照してください。
Luaとは異なり、Luanは文字列を数値に自動変換しません。
ビット演算子はLua 5.3への新しい追加のようで、Lua 5.2には存在しませんでした。 Luanはビット演算子をサポートしていませんが、必要に応じて追加できます。
Luanでの唯一の変更は、notがブール引数を取る必要があることです。 これにより、エラーをキャッチし、コードの可読性が向上します。
Luaとは異なり、Luanはすべての連結オペランドを文字列に変換します。
Luaとは異なり、Luanはテーブルコンストラクタでend_of_lineをフィールドセパレータと見なします。
Luaとは異なり、Luanは関数に余分な非nil引数を渡すことを許可しません。 Luanでは、これはエラーを引き起こします。 この変更により、他の方法では非常に検出が難しいコーディングミスを見つけるのに役立ちます。
LuanはLuaのv:name(args)スタイルのオブジェクト指向関数呼び出しをサポートしていません。 オブジェクト指向プログラミングはLuanでクロージャを使用して行われるため、この機能は必要ありません。
Luanは適切な末尾呼び出しをサポートしていません。 Javaがこれをクリーンにサポートしていないため、省略されました。
バックティック式はLuaには存在しないLuanの追加です。 Luanリファレンスマニュアルのバックティックを参照してください。