Luan / ドキュメント - reactionary software by fschmidt

LuanがLuaと異なる点

このドキュメントは、LuaLua 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がありますが、pcallxpcallはありません。代わりにtry文を追加します。Luanのエラーはメッセージオブジェクトではなく、エラーテーブルとして実装されています。

メタテーブルとメタメソッド

目次

Luanはテーブルにのみメタテーブルを持ち、他の型には持ちません。

Luanはcallメタメソッドをサポートしていません。callメタメソッドでできることは、クロージャを使用してよりクリーンに行うことができるため、これは省略されました。

ガベージコレクション

目次

LuanはJavaのガベージコレクションを使用します。Luanには特別なガベージコレクションメソッドはありません。

Luanにはまだ弱いテーブルはありませんが、これが追加される予定です。

コルーチン

目次

Luanにはコルーチンがありません。コルーチンはシンプルな言語には必要ない複雑な概念であるため、省略されました。

言語

目次

字句規則

目次

Luaとは異なり、Luanは行の終わりを文の終わりと見なします。これにより、エラーをキャッチし、可読性を高めます。別の行で文を続けたい場合は、改行の後にバックスラッシュを使用できます。これは空白として扱われます。

LuanはLuaと同様のキーワードセットを持ち、他の字句規則も同じです。

変数

目次

デフォルトでは、グローバル変数はなく、未定義の変数はコンパイルエラーを生成します。グローバル変数を有効にするには、_ENVを定義する必要があります。グローバル変数を避けることで、コンパイル時にエラーをキャッチしやすくなります。

目次

Luanはブロック終端子end_doend_forend_functionend_ifend_tryend_whileを追加します。これらは適切なブロックタイプを終了するために使用できますが、endも任意のブロックを終了するために使用できます。

Luanのほとんどの文はLuaと同じです。異なる文のみがここにリストされます。

制御構造

目次

Luanのifwhilerepeat文は、条件式がブール値を返す必要がある点を除いて、Luaと同じです。他の値型はエラーを生成します。これにより、エラーをキャッチし、コードの可読性が向上します。

Luanはループ内で使用されるcontinue文を追加します。

Luanにはgoto文がありません。

For文

目次

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

Try文

目次

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