このドキュメントは、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リファレンスマニュアルのバックティックを参照してください。