Luaref

Nvimの:helpページは、生成されたもので、ソースtree-sitter-vimdocパーサーを使って解析したものです。


Lua リファレンスマニュアル
バージョン 0.3.0 2022年8月7日
Vimdoc バージョン (c) 2006 Luis Carvalho <lexcarvalho at gmail dot com>
「Lua: 5.1 リファレンスマニュアル」R. Ierusalimschy, L. H. de Figueiredo, W. Celes Copyright (c) 2006 Lua.org, PUC-Rio を改変。
このマニュアルの情報についてはlua-ref-docを参照してください。著作権とライセンスについてはlua-ref-copyrightを参照してください。

1 はじめに luaref-intro

Luaは、データ記述機能を備えた一般的な手続き型プログラミングをサポートするために設計された拡張プログラミング言語です。また、オブジェクト指向プログラミング、関数型プログラミング、データ駆動型プログラミングも強力にサポートします。Luaは、スクリプト言語を必要とするあらゆるプログラム向けの、強力で軽量なスクリプト言語として使用されることを目的としています。Luaは、クリーンなC(ANSI CとC++の共通サブセット)で記述されたライブラリとして実装されています。
拡張言語であるLuaには、「メイン」プログラムの概念はありません。Luaは、埋め込みプログラムまたは単にホストと呼ばれるホストクライアントに埋め込まれてのみ動作します。このホストプログラムは、Luaコードを実行する関数を呼び出し、Lua変数の書き込みと読み取りを行い、Luaコードから呼び出されるC関数を登録できます。C関数の使用を通じて、Luaは幅広い異なるドメインに対応するように拡張でき、それによって構文フレームワークを共有するカスタマイズされたプログラミング言語を作成できます。
Luaはフリーソフトウェアであり、ライセンスに記載されているように、通常どおり保証なしで提供されます。このマニュアルで説明する実装は、Luaの公式Webサイト(www.lua.org)で入手できます。
他のリファレンスマニュアルと同様に、このドキュメントは場所によっては味気ないものになっています。Luaの設計の背後にある決定事項については、lua-ref-bibliographyにある参考文献を参照してください。Luaでのプログラミングの詳細な入門については、ロベルトの本『Programming in Lua』を参照してください。
Luaはポルトガル語で「月」を意味し、ルーアと発音します。

2 言語 lua-language

このセクションでは、Luaの字句、構文、意味について説明します。言い換えれば、このセクションでは、どのトークンが有効か、それらがどのように組み合わされるか、そしてそれらの組み合わせが何を意味するかについて説明します。
言語構成要素は、通常の拡張BNF表記法を使用して説明します。この表記法では、{ a }は0個以上のaを意味し、[ a ]はオプションのaを意味します。

2.1 字句規則 lua-lexical

lua-names lua-identifiers Luaの名前(識別子とも呼ばれます)は、先頭が数字以外であれば、文字、数字、およびアンダースコアの任意の文字列にできます。これは、ほとんどの言語での識別子の定義と一致します。(文字の定義は現在のロケールに依存します。現在のロケールでアルファベットと見なされる任意の文字を識別子に使用できます。)識別子は、変数やテーブルフィールドに名前を付けるために使用されます。
以下のキーワードは予約されており、名前として使用することはできません。
and       break     do        else      elseif
end       false     for       function  if
in        local     nil       not       or
repeat    return    then      true      until     while
Luaは大文字と小文字を区別する言語です。andは予約語ですが、AndANDは異なる有効な名前です。慣例として、アンダースコアに続けて大文字で始まる名前(_VERSIONなど)は、Luaで使用される内部グローバル変数用に予約されています。
次の文字列は、他のトークンを示します。
+     -     *     /     %     ^     #
==    ~=    <=    >=    <     >     =
(     )     {     }     [     ]
;     :     ,     .     ..    ...
lua-literal
リテラル文字列は、一致する単一引用符または二重引用符で区切ることができ、次のCスタイルのエスケープシーケンスを含めることができます。
\a ベル
\b バックスペース
\f 改ページ
\n 改行
\r キャリッジリターン
\t 水平タブ
\v 垂直タブ
\\ バックスラッシュ
\" 引用符(二重引用符)
\' アポストロフィ(単一引用符)
さらに、バックスラッシュに続けて実際改行すると、文字列では改行になります。文字列内の文字は、エスケープシーケンス\dddを使用して、その数値で指定することもできます。dddは、最大3桁の10進数のシーケンスです。(数値エスケープの後に数字が続く場合は、正確に3桁で表現する必要があることに注意してください。)Luaの文字列には、埋め込みゼロを含む任意の8ビット値を格納できます。埋め込みゼロは\0として指定できます。
二重(単一)引用符で囲まれたリテラル文字列の内側に二重(単一)引用符、改行、バックスラッシュ、または埋め込みゼロを配置するには、エスケープシーケンスを使用する必要があります。その他の文字は、リテラルに直接挿入できます。(一部の制御文字はファイルシステムで問題を引き起こす可能性がありますが、Luaには問題ありません。)
リテラル文字列は、長い括弧で囲まれた長い形式を使用して定義することもできます。レベルnの開始長い括弧を、開始角括弧の後にn個の等号を続け、別の開始角括弧が続くものとして定義します。したがって、レベル0の開始長い括弧は[[と記述され、レベル1の開始長い括弧は[=[と記述され、以下同様です。終了長い括弧は同様に定義されます。たとえば、レベル4の終了長い括弧は]====]と記述されます。長い文字列は、任意のレベルの開始長い括弧で始まり、同じレベルの最初の終了長い括弧で終わります。この括弧形式のリテラルは、複数行にわたって記述でき、エスケープシーケンスを解釈せず、他のレベルの長い括弧を無視します。適切なレベルの終了括弧を除く、あらゆるものを含めることができます。
便宜上、開始長い括弧の直後に改行が続く場合、改行は文字列に含まれません。例として、ASCIIを使用するシステム(aが97、改行が10、1が49としてコード化されている場合)、以下の5つのリテラルは同じ文字列を表します。
a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]
a = [==[
alo
123"]==]
lua-numconstant
数値定数は、オプションの小数部とオプションの10進数指数を使用して記述できます。Luaは、0xをプレフィックスとして付けることで、整数の16進定数も受け入れます。有効な数値定数の例を次に示します。
3     3.0     3.1416  314.16e-2   0.31416E1   0xff   0x56
lua-comment
コメントは、文字列の外側の任意の場所で二重ハイフン(--)で始まります。--の直後のテキストが開始長い括弧でない場合、コメントは行末まで続く短いコメントです。そうでない場合は、対応する終了長い括弧まで続く長いコメントです。長いコメントは、コードを一時的に無効にするためによく使用されます。

2.2 値と型 lua-values

Luaは動的型付き言語です。これは、変数には型がなく、値のみに型があることを意味します。言語には型の定義はありません。すべての値は独自の型を持っています。
Luaのすべての値は、第一級の値です。これは、すべての値を変数に格納したり、他の関数に引数として渡したり、結果として返すことができることを意味します。
lua-types lua-nil lua-true lua-false lua-number lua-string Luaには、nilbooleannumberstringfunctionuserdatathread、およびtableの8つの基本型があります。Nilは値nilの型であり、その主な特性は他のどの値とも異なることです。通常、有用な値がないことを表します。Booleanは、値falsetrueの型です。nilfalseの両方が条件を偽にします。他の値はすべて真にします。Numberは、実数(倍精度浮動小数点)数を表します。(単精度浮動小数点数や長整数など、他の内部表現を数値に使用するLuaインタープリターを簡単に構築できます。ファイルluaconf.hを参照してください。)Stringは、文字の配列を表します。Luaは8ビットクリーンです。文字列には、埋め込みゼロ(\0)を含む任意の8ビット文字を含めることができます(lua-literalを参照)。
Luaは、Luaで記述された関数とCで記述された関数を呼び出す(および操作する)ことができます(lua-functionを参照)。
lua-userdatatype
型userdataは、任意のCデータをLua変数に格納できるようにするために提供されます。この型は、生のメモリのブロックに対応し、Luaでは代入と同一性テストを除いて、事前定義された操作はありません。ただし、メタテーブルを使用すると、プログラマはuserdata値の操作を定義できます(lua-metatableを参照)。Userdata値は、Luaでは作成または変更できず、C APIを通じてのみ可能です。これにより、ホストプログラムが所有するデータの整合性が保証されます。
lua-thread
threadは、実行の独立したスレッドを表し、コルーチンを実装するために使用されます(lua-coroutineを参照)。Luaスレッドをオペレーティングシステムのスレッドと混同しないでください。Luaは、スレッドをサポートしていないシステムでも、すべてのシステムでコルーチンをサポートします。
lua-table
tableは、連想配列を実装します。つまり、数値だけでなく、任意の値(nilを除く)でインデックス付けできる配列です。テーブルは異種にすることができます。つまり、すべての型(nilを除く)の値を含めることができます。テーブルは、Luaにおける唯一のデータ構造化メカニズムです。テーブルを使用して、通常の配列、シンボルテーブル、セット、レコード、グラフ、ツリーなどを表すことができます。レコードを表すために、Luaはフィールド名をインデックスとして使用します。言語は、a.namea["name"]の糖衣構文として提供することで、この表現をサポートします。Luaでテーブルを作成するための便利な方法がいくつかあります(lua-tableconstructorを参照)。
インデックスと同様に、テーブルフィールドの値は、任意の型(nilを除く)にできます。特に、関数は第一級の値であるため、テーブルフィールドには関数を含めることができます。したがって、テーブルはメソッドを保持することもできます(lua-function-defineを参照)。
テーブル、関数、スレッド、(完全な)userdata値はオブジェクトです。変数は実際にはこれらの値を保持しておらず、それらへの参照のみを保持しています。代入、パラメータ渡し、および関数戻り値は、常にそのような値への参照を操作します。これらの操作は、コピーを意味するものではありません。
ライブラリ関数typeは、指定された値の型を記述する文字列を返します(lua-type()を参照)。

2.2.1 強制型変換 lua-coercion

Lua は、実行時に文字列と数値の値の間で自動的な変換を提供します。文字列に対して算術演算が適用されると、通常の変換規則に従って、その文字列を数値に変換しようとします。逆に、数値が文字列として期待される場所で使用される場合、その数値は適切な形式で文字列に変換されます。数値が文字列にどのように変換されるかを完全に制御するには、文字列ライブラリの format 関数を使用します ( string.format() を参照)。

2.3 変数 lua-variables

変数は値を格納する場所です。 Lua には、グローバル変数、ローカル変数、テーブルフィールドの 3 種類の変数があります。
単一の名前で、グローバル変数またはローカル変数 (またはローカル変数の特定形式である関数の仮引数) を示すことができます。
var ::= Name
名前は、lua-lexical で定義されている識別子を示します。
すべての変数は、明示的にローカルとして宣言されない限り ( lua-local を参照)、グローバルであると見なされます。ローカル変数は、レキシカルスコープを持ちます。ローカル変数は、そのスコープ内で定義された関数から自由にアクセスできます ( lua-visibility を参照)。
変数への最初の代入前は、その値は nil です。
角括弧は、テーブルのインデックスに使用されます。
var ::= prefixexp [ exp ]
最初の式 (prefixexp) はテーブル値を生成する必要があります。2 番目の式 (exp) は、そのテーブル内の特定のエントリを識別します。インデックス付けされるテーブルを示す式には、構文上の制限があります。詳細については、lua-expressions を参照してください。
構文 var.NAME は、var["NAME"] の糖衣構文です。
var ::= prefixexp . Name
すべてのグローバル変数は、環境テーブル、または単に環境と呼ばれる通常の Lua テーブルのフィールドとして存在します ( lua-environments を参照)。各関数は環境への独自のリファレンスを持つため、この関数内のすべてのグローバル変数はこの環境テーブルを参照します。関数が作成されると、その関数はそれを作成した関数から環境を継承します。Lua 関数の環境テーブルを取得するには、getfenv を呼び出します ( lua_getfenv() を参照)。それを置き換えるには、setfenv を呼び出します ( setfenv() を参照)。(C 関数の環境は、デバッグライブラリを通してのみ操作できます。 lua-lib-debug を参照してください)。
グローバル変数 x へのアクセスは、_env.x と同等であり、これはさらに
gettable_event(_env, "x")
ここで、_env は実行中の関数の環境です。(_env 変数は Lua では定義されていません。ここでは説明のためだけに使用しています)。
グローバル変数とテーブルフィールドへのアクセスの意味は、メタテーブルを通じて変更できます。インデックス付き変数 t[i] へのアクセスは、gettable_event(t,i) の呼び出しと同等です。(gettable_event 関数の完全な説明については、lua-metatable を参照してください。この関数は Lua では定義されておらず、呼び出すこともできません。ここでは説明のためだけに使用しています)。

2.4 ステートメント lua-statement

Lua は、Pascal や C に似た、ほぼ従来のステートメントセットをサポートしています。このセットには、代入、制御構造、関数呼び出し、変数宣言が含まれます。

2.4.1 チャンク lua-chunk

Lua の実行単位はチャンクと呼ばれます。チャンクは、単純に順次実行されるステートメントのシーケンスです。各ステートメントの後にセミコロンを付けることができます (オプション)。
chunk ::= {stat [ ; ]}
空のステートメントは存在しないため、;; は有効ではありません。
Lua は、チャンクを可変数の引数を持つ匿名関数の本体として扱います ( lua-function-define を参照)。そのため、チャンクはローカル変数を定義したり、引数を受け取ったり、値を返したりできます。
チャンクは、ファイルまたはホストプログラム内の文字列に格納できます。チャンクが実行されると、最初に仮想マシンの命令にプリコンパイルされ、次にコンパイルされたコードが仮想マシンのインタープリターによって実行されます。
チャンクはバイナリ形式にプリコンパイルすることもできます。詳細については、プログラム luac を参照してください。ソース形式とコンパイル形式のプログラムは交換可能です。Lua はファイルタイプを自動的に検出し、それに応じて動作します。

2.4.2 ブロック lua-block

ブロックはステートメントのリストです。構文的には、ブロックはチャンクと同じです。
block ::= chunk
lua-do lua-end ブロックは、単一のステートメントを生成するために明示的に区切ることができます。
stat ::= do block end
明示的なブロックは、変数宣言のスコープを制御するのに役立ちます。明示的なブロックは、別のブロックの中間に return または break ステートメントを追加するためにも使用されることがあります ( lua-control を参照)。

2.4.3 代入 lua-assign

Lua では複数の代入が可能です。したがって、代入の構文は、左側に変数のリストを、右側に式のリストを定義します。両方のリストの要素は、コンマで区切られます。
stat ::= varlist1 = explist1
varlist1 ::= var { , var }
explist1 ::= exp { , exp }
式については、lua-expressions で説明します。
代入の前に、値のリストは変数のリストの長さに調整されます。必要な値よりも多くの値がある場合、余分な値は破棄されます。必要な値よりも少ない値しかない場合は、必要な数の nil でリストが拡張されます。式のリストが関数呼び出しで終わる場合、この呼び出しによって返されるすべての値は、調整前に値のリストに入ります (ただし、呼び出しが括弧で囲まれている場合は除きます。 lua-expressions を参照)。
代入ステートメントは、最初にすべての式を評価し、その後で代入が実行されます。したがって、コード
i = 3
i, a[i] = i+1, 20
は、a[i]i が (4 が代入される前に) 3 と評価されるため、a[4] に影響を与えることなく、a[3] を 20 に設定します。同様に、次の行
x, y = y, x
は、xy の値を交換します。
グローバル変数とテーブルフィールドへの代入の意味は、メタテーブルを通じて変更できます。インデックス付き変数 t[i] = val への代入は、settable_event(t,i,val) と同等です。(settable_event 関数の完全な説明については、lua-metatable を参照してください。この関数は Lua では定義されておらず、呼び出すこともできません。ここでは説明のためだけに使用しています)。
グローバル変数 x = val への代入は、代入 _env.x = val と同等であり、これはさらに
settable_event(_env, "x", val)
ここで、_env は実行中の関数の環境です。(_env 変数は Lua では定義されていません。ここでは説明のためだけに使用しています)。

2.4.4 制御構造 lua-control

lua-if lua-then lua-else lua-elseif lua-while lua-repeat lua-until 制御構造 ifwhile、および repeat は、通常の意味と慣れ親しんだ構文を持っています。
stat ::=  while  exp do block end
stat ::=  repeat  block until exp
stat ::=  if  exp then block { elseif exp then block }
          [ else block ] end
Lua には、2 つの形式の for ステートメントもあります ( lua-for を参照)。
制御構造の条件式は、任意の値​​を返すことができます。 falsenil の両方が false と見なされます。nilfalse 以外のすべての値は true と見なされます (特に、数値 0 と空の文字列も true です)。
repeat-until ループでは、内部ブロックは until キーワードで終了するのではなく、条件の後でのみ終了します。したがって、条件はループブロック内で宣言されたローカル変数を参照できます。
lua-return
return ステートメントは、関数またはチャンク (これは単なる関数です) から値を返すために使用されます。関数とチャンクは複数の値を返すことができるため、return ステートメントの構文は次のようになります。
stat ::= return [explist1]
lua-break
break ステートメントは、whilerepeat、または for ループの実行を終了し、ループの後の次のステートメントにスキップするために使用されます。
stat ::= break
break は、最も内側の包含ループを終了します。
return および break ステートメントは、ブロックの last ステートメントとしてのみ記述できます。ブロックの途中で return または break することが本当に必要な場合は、do return end および do break end というイディオムのように、明示的な内部ブロックを使用できます。これは、return および break がそれらの (内部) ブロック内の最後のステートメントになったためです。

2.4.5 For ステートメント for lua-for

for ステートメントには、数値とジェネリックの 2 つの形式があります。
数値 for ループは、制御変数が算術的な進行を繰り返す間、コードのブロックを繰り返します。これには、次の構文があります。
stat ::=  for  Name = exp , exp [ , exp ] do block end
block は、最初の exp の値から始まり、3 番目の exp のステップで 2 番目の exp を超えるまで、name に対して繰り返されます。より正確には、次のような for ステートメント
for var = e1, e2, e3 do block end
は、次のコードと同等です。
do
  local  var, limit, step  = tonumber(e1), tonumber(e2), tonumber(e3)
  if not (  var  and  limit  and  step  ) then error() end
  while (  step  >0 and  var  <=  limit  )
          or (  step  <=0 and  var  >=  limit  ) do
     block
     var  =  var  +  step
  end
end
以下に注意してください。
3 つの制御式はすべて、ループ開始前に一度だけ評価されます。それらはすべて数値でなければなりません。
varlimit、および step は、不可視変数です。名前は、説明のためだけにここにあります。
3 番目の式 (ステップ) がない場合、1 のステップが使用されます。
break を使用して for ループを終了できます。
ループ変数 var はループに対してローカルです。for が終了または中断された後、その値を使用することはできません。この値が必要な場合は、ループを中断または終了する前に、別の変数に代入してください。
for-in
ジェネリック for ステートメントは、イテレーターと呼ばれる関数に対して機能します。反復ごとに、新しい値を生成するためにイテレーター関数が呼び出され、この新しい値が nil になると停止します。ジェネリック for ループには、次の構文があります。
stat ::=  for  namelist in explist1 do block end
namelist ::= Name { , Name }
次のような for ステートメント
for var1, ..., varn in explist do block end
は、次のコードと同等です。
do
  local  f, s, var  =  explist
  while true do
      local  var1, ..., varn  =  f(s, var)
      var  =  var1
      if  var  == nil then break end
      block
  end
end
以下に注意してください。
explist は一度だけ評価されます。その結果は、イテレーター関数、state、および最初のイテレーター変数の初期値です。
fs、および var は、不可視変数です。名前は、説明のためだけにここにあります。
break を使用して for ループを終了できます。
ループ変数 var1, ..., varn は、ループに対してローカルです。for が終了した後、それらの値を使用することはできません。これらの値が必要な場合は、ループを中断または終了する前に、他の変数に代入してください。

2.4.6 ステートメントとしての関数呼び出し lua-funcstatement

起こりうる副作用を許可するために、関数呼び出しはステートメントとして実行できます。
stat ::= functioncall
この場合、返された値はすべて破棄されます。関数呼び出しについては、lua-function で説明します。

2.4.7 ローカル宣言 lua-local

ローカル変数は、ブロック内の任意の場所で宣言できます。宣言には、初期代入を含めることができます。
stat ::=  local  namelist [ = explist1 ]
namelist ::= Name { , Name }
存在する場合、初期代入は複数の代入と同じセマンティクスを持ちます ( lua-assign を参照)。それ以外の場合、すべての変数は nil で初期化されます。
チャンクはブロックでもあります(lua-chunk参照)。そのため、ローカル変数は明示的なブロックの外のチャンクで宣言できます。このようなローカル変数のスコープはチャンクの最後まで拡張されます。
ローカル変数の可視性ルールはlua-visibilityで説明されています。

2.5 式 lua-expressions

Luaの基本的な式は以下のとおりです。
exp ::= prefixexp
exp ::=  nil  |  false  |  true
exp ::= Number
exp ::= String
exp ::= function
exp ::= tableconstructor
exp ::= ...
exp ::= exp binop exp
exp ::= unop exp
prefixexp ::= var | functioncall | ( exp )
数値とリテラル文字列についてはlua-lexicalで説明されています。変数はlua-variablesで説明されています。関数定義はlua-function-defineで説明されています。関数呼び出しはlua-functionで説明されています。テーブルコンストラクタはlua-tableconstructorで説明されています。3つのドット(...)で表される可変長引数式は、可変長引数関数内でのみ使用できます。これについてはlua-function-defineで説明されています。
二項演算子には、算術演算子(lua-arithmetic参照)、関係演算子(lua-relational参照)、論理演算子(lua-logicalop参照)、および連結演算子(lua-concat参照)が含まれます。単項演算子には、単項マイナス(lua-arithmetic参照)、単項notlua-logicalop参照)、および単項長演算子(lua-length参照)が含まれます。
関数呼び出しと可変長引数式の両方が複数の値を返す可能性があります。式がステートメントとして使用される場合(lua-funcstatement参照)(関数呼び出しの場合のみ可能)、その戻り値リストはゼロ要素に調整され、返されたすべての値が破棄されます。式が式リストの最後(または唯一)の要素として使用される場合、(呼び出しが括弧で囲まれていない限り)調整は行われません。他のすべてのコンテキストでは、Luaは結果リストを1つの要素に調整し、最初の値を除くすべての値を破棄します。
いくつかの例を以下に示します。
f()                -- adjusted to 0 results
g(f(), x)          -- f() is adjusted to 1 result
g(x, f())          -- g gets x plus all results from f()
a,b,c = f(), x     -- f() is adjusted to 1 result (c gets nil)
a,b = ...          -- a gets the first vararg parameter, b gets
                   -- the second (both a and b may get nil if there
                   -- is no corresponding vararg parameter)
a,b,c = x, f()     -- f() is adjusted to 2 results
a,b,c = f()        -- f() is adjusted to 3 results
return f()         -- returns all results from f()
return ...         -- returns all received vararg parameters
return x,y,f()     -- returns x, y, and all results from f()
{f()}              -- creates a list with all results from f()
{...}              -- creates a list with all vararg parameters
{f(), nil}         -- f() is adjusted to 1 result
括弧で囲まれた式は常に1つの値のみになります。したがって、fが複数の値を返す場合でも、(f(x,y,z))は常に単一の値になります。((f(x,y,z))の値は、fが返す最初の値、またはfが値を返さない場合はnilです。)

2.5.1 算術演算子 lua-arithmetic

Luaは、通常の算術演算子、つまり、二項演算子の+(加算)、-(減算)、*(乗算)、/(除算)、%(剰余)、および^(べき乗)、そして単項演算子の-(否定)をサポートしています。オペランドが数値、または数値に変換できる文字列(lua-coercion参照)の場合、すべての演算は通常の意味を持ちます。べき乗は任意の指数で機能します。たとえば、x^(-0.5)xの平方根の逆数を計算します。剰余は次のように定義されます。
a % b == a - math.floor(a/b)*b
つまり、商をマイナス無限大に向かって丸める除算の余りです。

2.5.2 関係演算子 lua-relational

Luaの関係演算子は次のとおりです。
==    ~=    <     >     <=    >=
これらの演算子は常にfalseまたはtrueを返します。
等価(==)は、最初にオペランドの型を比較します。型が異なる場合、結果はfalseです。それ以外の場合は、オペランドの値が比較されます。数値と文字列は通常の方法で比較されます。オブジェクト(テーブル、userdata、スレッド、および関数)は参照によって比較されます。2つのオブジェクトは、同じオブジェクトである場合にのみ等しいと見なされます。新しいオブジェクト(テーブル、userdata、または関数)を作成するたびに、この新しいオブジェクトは、以前に存在したオブジェクトとは異なります。
「eq」メタメソッド(lua-metatable参照)を使用して、Luaがテーブルとuserdataを比較する方法を変更できます。
強制型の変換規則lua-coercionは、等価比較には適用されません。したがって、"0"==0falseと評価され、t[0]t["0"]はテーブル内の異なるエントリを表します。
演算子~=は、等価(==)の否定です。
順序演算子は次のように動作します。両方の引数が数値の場合、それらは数値として比較されます。それ以外の場合は、両方の引数が文字列の場合、それらの値は現在のロケールに従って比較されます。それ以外の場合、Luaは「lt」または「le」メタメソッドを呼び出そうとします(lua-metatable参照)。

2.5.3 論理演算子 lua-logicalop

Luaの論理演算子は次のとおりです。
and    or    not
制御構造(lua-control参照)と同様に、すべての論理演算子はfalsenilをfalseとみなし、それ以外をtrueとみなします。
lua-not lua-and lua-or 否定演算子notは常にfalseまたはtrueを返します。連言演算子andは、この値がfalseまたはnilの場合は最初の引数を返し、それ以外の場合は2番目の引数を返します。選言演算子orは、この値がnilおよびfalseと異なる場合は最初の引数を返し、それ以外の場合は2番目の引数を返します。andorの両方がショートカット評価を使用します。つまり、2番目のオペランドは必要な場合にのみ評価されます。いくつかの例を以下に示します。
10 or 20            --> 10
10 or error()       --> 10
nil or "a"          --> "a"
nil and 10          --> nil
false and error()   --> false
false and nil       --> false
false or nil        --> nil
10 and 20           --> 20
(このマニュアルでは、-->は先行する式の結果を示します。)

2.5.4 連結 lua-concat

Luaの文字列連結演算子は、2つのドット(..)で示されます。両方のオペランドが文字列または数値の場合、lua-coercionで説明されている規則に従って文字列に変換されます。それ以外の場合は、「concat」メタメソッドが呼び出されます(lua-metatable参照)。

2.5.5 長さ演算子 lua-# lua-length

長さ演算子は単項演算子#で示されます。文字列の長さは、そのバイト数です(つまり、各文字が1バイトの場合の文字列長の通常の意味)。
テーブルtの長さは、t[n]nilでなく、t[n+1]nilであるような任意の整数インデックスnとして定義されます。さらに、t[1]nilの場合、nはゼロになる可能性があります。1から特定のnまでの非nil値を持つ通常の配列の場合、その長さは正確にそのn、つまりその最後の値のインデックスです。配列に「穴」(つまり、他の非nil値の間のnil値)がある場合、#tnil値の直前にあるインデックスのいずれかである可能性があります(つまり、そのようなnil値を配列の末尾と見なす可能性があります)。

2.5.6 優先順位 lua-precedence

Luaの演算子の優先順位は、低いものから高いものの順に以下の表に従います。
or
and
<     >     <=    >=    ~=    ==
..
+     -
*     /
not   #     - (unary)
^
通常どおり、式内で括弧を使用して優先順位を変更できます。連結(..)演算子とべき乗(^)演算子は右結合です。他のすべての二項演算子は左結合です。

2.5.7 テーブルコンストラクタ lua-tableconstructor

テーブルコンストラクタは、テーブルを作成する式です。コンストラクタが評価されるたびに、新しいテーブルが作成されます。コンストラクタは、空のテーブルを作成したり、テーブルを作成してそのフィールドの一部を初期化したりするために使用できます。コンストラクタの一般的な構文は次のとおりです。
tableconstructor ::= { [ fieldlist ] }
fieldlist ::= field { fieldsep field } [ fieldsep ]
field ::= [ exp ]  = exp | Name = exp | exp
fieldsep ::=  , |  ;
[exp1] = exp2形式の各フィールドは、キーexp1と値exp2を持つエントリを新しいテーブルに追加します。name = exp形式のフィールドは、["name"] = expと同等です。最後に、exp形式のフィールドは、[i] = expと同等です。ここで、iは、1から始まる連続した数値整数です。他の形式のフィールドは、このカウントには影響しません。たとえば、
a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
は、次と同等です。
do
  local t = {}
  t[f(1)] = g
  t[1] = "x"         -- 1st exp
  t[2] = "y"         -- 2nd exp
  t.x = 1            -- temp["x"] = 1
  t[3] = f(x)        -- 3rd exp
  t[30] = 23
  t[4] = 45          -- 4th exp
  a = t
end
リスト内の最後のフィールドがexp形式で、式が関数呼び出しの場合、呼び出しによって返されたすべての値がリストに連続して入力されます(lua-function参照)。これを回避するには、関数呼び出しを括弧で囲みます(lua-expressions参照)。
フィールドリストには、マシン生成コードの便宜のために、オプションの末尾の区切り文字を含めることができます。

2.5.8 関数呼び出し lua-function

Luaの関数呼び出しの構文は次のとおりです。
functioncall ::= prefixexp args
関数呼び出しでは、最初にprefixexpargsが評価されます。prefixexpの値の型がfunctionの場合、この関数は指定された引数で呼び出されます。それ以外の場合、prefixexpの「call」メタメソッドが呼び出され、最初のパラメータとしてprefixexpの値が渡され、その後に元の呼び出し引数が続きます(lua-metatable参照)。
形式
functioncall ::= prefixexp : Name args
を使用して「メソッド」を呼び出すことができます。呼び出しv:name( args )は、v.name(v, args )の構文糖ですが、vは1回だけ評価されます。
引数の構文は次のとおりです。
args ::=  ( [ explist1 ] )
args ::= tableconstructor
args ::= String
すべての引数式は、呼び出しの前に評価されます。f{ fields }形式の呼び出しは、f({ fields })の構文糖です。つまり、引数リストは単一の新しいテーブルです。f' string '(またはf" string "またはf[[ string ]])形式の呼び出しは、f(' string ')の構文糖です。つまり、引数リストは単一のリテラル文字列です。
Luaの自由形式構文の例外として、関数呼び出しの(の前に改行を入れることはできません。この制限により、言語の曖昧さが回避されます。次のように記述すると、
a = f
(g).x(a)
Luaはそれを単一のステートメントa = f(g).x(a)として認識します。したがって、2つのステートメントが必要な場合は、それらの間にセミコロンを追加する必要があります。実際にfを呼び出す場合は、(g)の前の改行を削除する必要があります。
lua-tailcall
return functioncall形式の呼び出しは、末尾呼び出しと呼ばれます。Luaは適切な末尾呼び出し(または適切な末尾再帰)を実装します。末尾呼び出しでは、呼び出される関数は呼び出し元の関数のスタックエントリを再利用します。したがって、プログラムが実行できるネストされた末尾呼び出しの数に制限はありません。ただし、末尾呼び出しは、呼び出し元の関数のデバッグ情報を消去します。末尾呼び出しは、returnが引数として単一の関数呼び出しを持つ特定の構文でのみ発生することに注意してください。この構文により、呼び出し元の関数は呼び出された関数の戻り値を正確に返します。したがって、次の例はいずれも末尾呼び出しではありません。
return (f(x))        -- results adjusted to 1
return 2 * f(x)
return x, f(x)       -- additional results
f(x); return         -- results discarded
return x or f(x)     -- results adjusted to 1

2.5.9 関数定義 lua-function-define

関数定義の構文は次のとおりです。
function ::= function funcbody
funcbody ::= ( [ parlist1 ] ) block end
次の構文糖は、関数定義を簡略化します。
stat ::= function funcname funcbody
stat ::= local function Name funcbody
funcname ::= Name { . Name } [ : Name ]
ステートメント
function f () body end
は次のように変換されます。
f = function () body end
ステートメント
function t.a.b.c.f () body end
は次のように変換されます。
t.a.b.c.f = function () body end
ステートメント
local function f () body end
は次のように変換されます。
local f; f = function f () body end
対象外
local f = function f () body end
(これは、関数の本体がfへの参照を含む場合にのみ違いが生じます。)
lua-クロージャ
関数定義は、値がfunction型を持つ実行可能な式です。Luaがチャンクをプリコンパイルするとき、その関数本体もすべてプリコンパイルされます。そして、Luaが関数定義を実行するたびに、関数がインスタンス化(またはクロージャ化)されます。この関数インスタンス(またはクロージャ)が式の最終的な値です。同じ関数の異なるインスタンスは、異なる外部ローカル変数や異なる環境テーブルを参照する可能性があります。
パラメータは、引数の値で初期化されるローカル変数として機能します。
parlist1 ::= namelist [ , ... ] | ...
lua-可変長引数
関数が呼び出されるとき、引数のリストはパラメータのリストの長さに調整されます。ただし、関数が可変長引数関数である場合、パラメータリストの末尾に3つのドット(...)で示されます。可変長引数関数は引数リストを調整しません。代わりに、すべての余分な引数を収集し、それらを可変長引数式(これも3つのドットで記述されます)を介して関数に提供します。この式の値は、複数の結果を持つ関数と同様に、すべての実際の余分な引数のリストです。可変長引数式が別の式の中または式のリストの途中で使用される場合、その戻り値のリストは1つの要素に調整されます。式が式のリストの最後の要素として使用される場合、調整は行われません(呼び出しが括弧で囲まれている場合を除く)。
例として、次の定義を考えてみましょう。
function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
すると、引数からパラメータおよび可変長引数式への次のマッピングが得られます。
CALL            PARAMETERS
f(3)             a=3, b=nil
f(3, 4)          a=3, b=4
f(3, 4, 5)       a=3, b=4
f(r(), 10)       a=1, b=10
f(r())           a=1, b=2
g(3)             a=3, b=nil, ... -->  (nothing)
g(3, 4)          a=3, b=4,   ... -->  (nothing)
g(3, 4, 5, 8)    a=3, b=4,   ... -->  5  8
g(5, r())        a=5, b=1,   ... -->  2  3
結果はreturnステートメントを使用して返されます(lua-controlを参照)。returnステートメントに遭遇せずに制御が関数の最後に到達した場合、関数は結果なしで戻ります。
lua-コロン構文
コロン構文は、メソッド、つまり暗黙的な追加パラメータselfを持つ関数を定義するために使用されます。したがって、ステートメント
function t.a.b.c:f ( params ) body end
は、次の糖衣構文です。
t.a.b.c:f = function ( self, params ) body end

2.6 可視性規則 lua-visibility

Luaはレキシカルスコープ言語です。変数のスコープは、宣言後の最初のステートメントから始まり、宣言を含む最も内側のブロックの終わりまで続きます。次の例を考えてみましょう。
x = 10                -- global variable
do                    -- new block
  local x = x         -- new `x`, with value 10
  print(x)            --> 10
  x = x+1
  do                  -- another block
    local x = x+1     -- another `x`
    print(x)          --> 12
  end
  print(x)            --> 11
end
print(x)              --> 10  (the global one)
local x = xのような宣言では、宣言されている新しいxはまだスコープ内になく、したがって2番目のxは外部の変数を参照することに注意してください。
lua-アップバリュー
レキシカルスコープ規則により、ローカル変数はそのスコープ内で定義された関数から自由にアクセスできます。内部関数で使用されるローカル変数は、内部関数内でアップバリュー、または外部ローカル変数と呼ばれます。
ローカルステートメントの各実行は、新しいローカル変数を定義することに注意してください。次の例を考えてみましょう。
a = {}
local x = 20
for i=1,10 do
  local y = 0
  a[i] = function () y=y+1; return x+y end
end
ループは10個のクロージャ(つまり、匿名関数の10個のインスタンス)を作成します。これらの各クロージャは異なるy変数を使用しますが、すべて同じxを共有します。

2.7 エラー処理 lua-errors

Luaは組み込み拡張言語であるため、すべてのLuaアクションは、Luaライブラリから関数を呼び出すホストプログラムのCコードから開始されます(lua_pcall()を参照)。Luaのコンパイルまたは実行中にエラーが発生すると、制御はCに戻り、Cは適切な措置(エラーメッセージの出力など)を講じることができます。
Luaコードは、error関数(error()を参照)を呼び出すことで、明示的にエラーを生成できます。Luaでエラーをキャッチする必要がある場合は、pcall関数(pcall()を参照)を使用できます。

2.8 メタテーブル metatable lua-metatable

Luaのすべての値にはメタテーブルがあります。このメタテーブルは、特定の特殊な操作下で、元のテーブルとuserdataの動作を定義する通常のLuaテーブルです。メタテーブルに特定のフィールドを設定することにより、オブジェクトの動作のいくつかの側面を変更できます。たとえば、非数値が加算のオペランドである場合、Luaはそのメタテーブルのフィールド"__add"で関数を確認します。見つかった場合、Luaはその関数を呼び出して加算を実行します。
メタテーブルのキーをイベント、値をメタメソッドと呼びます。前の例では、イベントは「add」で、メタメソッドは加算を実行する関数です。
getmetatable関数(getmetatable()を参照)を使用して、任意の値のメタテーブルをクエリできます。
setmetatable関数(setmetatable()を参照)を使用して、テーブルのメタテーブルを置き換えることができます。Luaから他の型のメタテーブルを変更することはできません(デバッグライブラリを使用する場合を除く)。そのためにはC APIを使用する必要があります。
テーブルとuserdataは個別のメタテーブルを持っています(ただし、複数のテーブルとuserdataは同じテーブルをメタテーブルとして共有できます)。他のすべての型の値は、型ごとに1つのメタテーブルを共有します。したがって、すべての数値とすべての文字列などに対して、1つのメタテーブルがあります。
メタテーブルは、オブジェクトが算術演算、順序比較、連結、長さ操作、およびインデックス作成でどのように動作するかを制御できます。メタテーブルは、userdataがガベージコレクションされるときに呼び出される関数を定義することもできます。Luaはこれらの各操作に、イベントと呼ばれる特定のキーを関連付けます。Luaが値に対してこれらの操作の1つを実行するとき、この値が対応するイベントを持つメタテーブルを持っているかどうかを確認します。もしそうなら、そのキー(メタメソッド)に関連付けられた値が、Luaが操作を実行する方法を制御します。
メタテーブルは、次に示す操作を制御します。各操作は、対応する名前で識別されます。各操作のキーは、名前の先頭に2つのアンダースコア__が付いた文字列です。たとえば、操作「add」のキーは文字列「__add」です。これらの操作のセマンティクスは、インタープリターがその操作をどのように実行するかを記述するLua関数によってより適切に説明されます。
ここでLuaで示されているコードは例示にすぎません。実際の動作はインタープリターにハードコードされており、このシミュレーションよりもはるかに効率的です。これらの説明で使用されるすべての関数(rawgettonumberなど)は、lua-lib-coreで説明されています。特に、特定のオブジェクトのメタメソッドを取得するために、式を使用します。
metatable(obj)[event]
これは次のように読む必要があります。
rawget(metatable(obj) or {}, event)
つまり、メタメソッドへのアクセスは他のメタメソッドを呼び出さず、メタテーブルを持たないオブジェクトへのアクセスは失敗しません(単にnilになります)。
「add」: __add()
------ +演算。
以下の関数getbinhandlerは、Luaがバイナリ演算のハンドラーを選択する方法を定義します。まず、Luaは最初のオペランドを試します。その型が操作のハンドラーを定義していない場合、Luaは2番目のオペランドを試します。
function getbinhandler (op1, op2, event)
  return metatable(op1)[event] or metatable(op2)[event]
end
この関数を使用すると、op1 + op2の動作は次のようになります。
function add_event (op1, op2)
  local o1, o2 = tonumber(op1), tonumber(op2)
  if o1 and o2 then  -- both operands are numeric?
    return o1 + o2   -- `+` here is the primitive `add`
  else  -- at least one of the operands is not numeric
    local h = getbinhandler(op1, op2, "__add")
    if h then
      -- call the handler with both operands
      return h(op1, op2)
    else  -- no handler available: default behavior
      error(...)
    end
  end
end
「sub」: __sub()
------ -演算。「add」演算と同様の動作。
「mul」: __mul()
------ *演算。「add」演算と同様の動作。
「div」: __div()
------ /演算。「add」演算と同様の動作。
「mod」: __mod()
------ %演算。「add」演算と同様の動作。プリミティブ演算としてo1 - floor(o1/o2)*o2を使用。
「pow」: __pow()
------ ^(べき乗)演算。「add」演算と同様の動作。プリミティブ演算として(C mathライブラリの)関数powを使用。
「unm」: __unm()
------ 単項の-演算。
function unm_event (op)
  local o = tonumber(op)
  if o then  -- operand is numeric?
    return -o  -- `-` here is the primitive `unm`
  else  -- the operand is not numeric.
    -- Try to get a handler from the operand
    local h = metatable(op).__unm
    if h then
      -- call the handler with the operand
      return h(op)
    else  -- no handler available: default behavior
      error(...)
    end
  end
end
「concat」: __concat()
--------- ..(連結)演算。
function concat_event (op1, op2)
  if (type(op1) == "string" or type(op1) == "number") and
     (type(op2) == "string" or type(op2) == "number") then
    return op1 .. op2  -- primitive string concatenation
  else
    local h = getbinhandler(op1, op2, "__concat")
    if h then
      return h(op1, op2)
    else
      error(...)
    end
  end
end
「len」: __len()
------ #演算。
function len_event (op)
  if type(op) == "string" then
    return strlen(op)         -- primitive string length
  elseif type(op) == "table" then
    return #op                -- primitive table length
  else
    local h = metatable(op).__len
    if h then
      -- call the handler with the operand
      return h(op)
    else  -- no handler available: default behavior
      error(...)
    end
  end
end
「eq」: __eq()
----- ==演算。
関数getcomphandlerは、Luaが比較演算子のメタメソッドを選択する方法を定義します。メタメソッドは、比較される両方のオブジェクトが同じ型を持ち、選択された操作に対して同じメタメソッドを持つ場合にのみ選択されます。
function getcomphandler (op1, op2, event)
  if type(op1) ~= type(op2) then return nil end
  local mm1 = metatable(op1)[event]
  local mm2 = metatable(op2)[event]
  if mm1 == mm2 then return mm1 else return nil end
end
「eq」イベントは次のように定義されます。
function eq_event (op1, op2)
  if type(op1) ~= type(op2) then  -- different types?
    return false   -- different objects
  end
  if op1 == op2 then   -- primitive equal?
    return true   -- objects are equal
  end
  -- try metamethod
  local h = getcomphandler(op1, op2, "__eq")
  if h then
    return h(op1, op2)
  else
    return false
  end
end
a ~= bnot (a == b)と同等です。
「lt」: __lt()
----- <演算。
function lt_event (op1, op2)
  if type(op1) == "number" and type(op2) == "number" then
    return op1 < op2   -- numeric comparison
  elseif type(op1) == "string" and type(op2) == "string" then
    return op1 < op2   -- lexicographic comparison
  else
    local h = getcomphandler(op1, op2, "__lt")
    if h then
      return h(op1, op2)
    else
      error(...);
    end
  end
end
a > bb < aと同等です。
「le」: __le()
----- <=演算。
function le_event (op1, op2)
  if type(op1) == "number" and type(op2) == "number" then
    return op1 <= op2   -- numeric comparison
  elseif type(op1) == "string" and type(op2) == "string" then
    return op1 <= op2   -- lexicographic comparison
  else
    local h = getcomphandler(op1, op2, "__le")
    if h then
      return h(op1, op2)
    else
      h = getcomphandler(op1, op2, "__lt")
      if h then
        return not h(op2, op1)
      else
        error(...);
      end
    end
  end
end
a >= bb <= aと同等です。「le」メタメソッドがない場合、Luaはa <= bnot (b < a)と同等であると仮定して、「lt」を試行することに注意してください。
「index」: __index()
-------- インデックスアクセスtable[key]
function gettable_event (table, key)
  local h
  if type(table) == "table" then
    local v = rawget(table, key)
    if v ~= nil then return v end
    h = metatable(table).__index
    if h == nil then return nil end
  else
    h = metatable(table).__index
    if h == nil then
      error(...);
    end
  end
  if type(h) == "function" then
    return h(table, key)      -- call the handler
  else return h[key]          -- or repeat operation on it
end
「newindex」: __newindex()
----------- インデックス割り当てtable[key] = value
function settable_event (table, key, value)
  local h
  if type(table) == "table" then
    local v = rawget(table, key)
    if v ~= nil then rawset(table, key, value); return end
    h = metatable(table).__newindex
    if h == nil then rawset(table, key, value); return end
  else
    h = metatable(table).__newindex
    if h == nil then
      error(...);
    end
  end
  if type(h) == "function" then
    return h(table, key,value)    -- call the handler
  else h[key] = value             -- or repeat operation on it
end
「call」: __call()
------- Luaが値を呼び出すときに呼び出されます。
function function_event (func, ...)
  if type(func) == "function" then
    return func(...)   -- primitive call
  else
    local h = metatable(func).__call
    if h then
      return h(func, ...)
    else
      error(...)
    end
  end
end

2.9 環境 lua-environments

メタテーブルに加えて、thread、function、userdata型のオブジェクトには、それぞれ環境と呼ばれる別のテーブルが関連付けられています。メタテーブルと同様に、環境は通常のテーブルであり、複数のオブジェクトが同じ環境を共有できます。
userdataに関連付けられた環境は、Luaにとっては意味を持ちません。これはプログラマーがテーブルをuserdataに関連付けるための便利な機能にすぎません。
スレッドに関連付けられた環境は、グローバル環境と呼ばれます。それらはスレッドとそのスレッドによって作成された非ネスト化関数(loadfile()loadstring()、またはload()経由)のデフォルト環境として使用され、Cコードから直接アクセスできます(lua-pseudoindexを参照)。
C関数に関連付けられた環境は、Cコードから直接アクセスできます(lua-pseudoindexを参照)。それらは、その関数によって作成された他のC関数のデフォルト環境として使用されます。
Lua関数に関連付けられた環境は、関数内のグローバル変数へのすべてのアクセスを解決するために使用されます(lua-variablesを参照)。それらは、その関数によって作成された他のLua関数のデフォルト環境として使用されます。
Lua関数の環境または実行中のスレッドの環境は、setfenvを呼び出すことで変更できます。Lua関数または実行中のスレッドの環境は、getfenvを呼び出すことで取得できます(lua_getfenv()を参照)。他のオブジェクト(userdata、C関数、他のスレッド)の環境を操作するには、C APIを使用する必要があります。

2.10 ガベージコレクション lua-gc

Luaは自動メモリ管理を実行します。これは、新しいオブジェクトのメモリを割り当てることも、オブジェクトが不要になったときに解放することも心配する必要がないことを意味します。Luaは、不要になったオブジェクト(つまり、Luaからアクセスできなくなったオブジェクト)を収集するために、時々ガベージコレクターを実行して、自動的にメモリを管理します。Lua内のすべてのオブジェクト(テーブル、userdata、関数、スレッド、文字列)は、自動管理の対象となります。
Luaはインクリメンタルなマークアンドスイープコレクターを実装しています。ガベージコレクションサイクルを制御するために、2つの数値(ガベージコレクターの一時停止時間とガベージコレクターステップ乗数)を使用します。
ガベージコレクターの一時停止時間は、コレクターが新しいサイクルを開始するまで待機する時間を制御します。値が大きいほど、コレクターの動作が控えめになります。1未満の値は、コレクターが新しいサイクルを開始するまで待機しないことを意味します。値が2の場合、コレクターは、使用中の総メモリが2倍になるまで待機してから、新しいサイクルを開始します。
ステップ乗数は、メモリ割り当てに対するコレクターの相対的な速度を制御します。値が大きいほど、コレクターの動作が積極的になりますが、各インクリメンタルステップのサイズも増加します。1未満の値にすると、コレクターが遅くなりすぎて、サイクルが完了しない可能性があります。デフォルトの2は、コレクターがメモリ割り当ての「2倍」の速度で実行されることを意味します。
これらの数値は、Cではlua_gclua_gc()を参照)、Luaではcollectgarbagecollectgarbage()を参照)を呼び出すことで変更できます。どちらもパーセントポイントを引数として受け取ります(したがって、引数100は実際の値1を意味します)。これらの関数を使用すると、コレクターを直接制御することもできます(例えば、停止と再開)。

2.10.1 ガベージコレクションメタメソッド lua-gc-meta

C APIを使用すると、userdataにガベージコレクションメタメソッドを設定できます(lua-metatableを参照)。これらのメタメソッドは、ファイナライザーとも呼ばれます。ファイナライザーを使用すると、Luaのガベージコレクションを外部リソース管理(ファイルのクローズ、ネットワークまたはデータベース接続、または独自のメモリの解放など)と連携させることができます。
__gc
メタテーブルにフィールド__gcを持つガベージuserdataは、ガベージコレクターによってすぐに収集されません。代わりに、Luaはそれらをリストに入れます。収集後、Luaはそのリスト内の各userdataに対して、次の関数と同等の処理を行います。
function gc_event (udata)
  local h = metatable(udata).__gc
  if h then
    h(udata)
  end
end
各ガベージコレクションサイクルの最後に、userdataのファイナライザーは、そのサイクルで収集されたものの中で、作成された順序の逆順で呼び出されます。つまり、最初に呼び出されるファイナライザーは、プログラムで最後に作成されたuserdataに関連付けられたものです。

2.10.2 - ウィークテーブル lua-weaktable

ウィークテーブルは、要素がウィーク参照であるテーブルです。ウィーク参照は、ガベージコレクターによって無視されます。言い換えれば、オブジェクトへの唯一の参照がウィーク参照である場合、ガベージコレクターはこのオブジェクトを収集します。
__mode
ウィークテーブルは、ウィークキー、ウィーク値、またはその両方を持つことができます。ウィークキーを持つテーブルでは、キーの収集は許可されますが、値の収集は防止されます。ウィークキーとウィーク値の両方を持つテーブルでは、キーと値の両方の収集が許可されます。いずれの場合も、キーまたは値のいずれかが収集された場合、ペア全体がテーブルから削除されます。テーブルの弱さは、そのメタテーブルの__modeフィールドの値によって制御されます。__modeフィールドが文字kを含む文字列の場合、テーブル内のキーは弱くなります。__modevが含まれている場合、テーブル内の値は弱くなります。
テーブルをメタテーブルとして使用した後、そのフィールド__modeの値を変更しないでください。そうしないと、このメタテーブルによって制御されるテーブルの弱い動作は未定義になります。

2.11 コルーチン lua-coroutine

Luaはコルーチン(協調マルチスレッドとも呼ばれます)をサポートしています。Luaのコルーチンは、独立した実行スレッドを表します。ただし、マルチスレッドシステムの スレッドとは異なり、コルーチンはyield関数を明示的に呼び出すことでのみ実行を一時停止します。
コルーチンは、coroutine.createcoroutine.create()を参照)を呼び出すことで作成します。唯一の引数は、コルーチンのメイン関数である関数です。create関数は新しいコルーチンを作成し、そのハンドル(thread型のオブジェクト)を返すだけです。コルーチンの実行は開始しません。
coroutine.resumecoroutine.resume()を参照)を初めて呼び出すときに、最初の引数としてcoroutine.createによって返されたスレッドを渡すと、コルーチンの実行がメイン関数の最初の行から開始されます。coroutine.resumeに渡された追加の引数は、コルーチンのメイン関数に渡されます。コルーチンが実行を開始すると、終了するかyieldするまで実行されます。
コルーチンは、2つの方法で実行を終了できます。正常に終了する場合(メイン関数が明示的または暗黙的に、最後の命令の後に戻る場合)と、保護されていないエラーがある場合に異常終了する場合です。最初の場合、coroutine.resumetrueと、コルーチンのメイン関数によって返されたすべての値を返します。エラーの場合、coroutine.resumefalseとエラーメッセージを返します。
コルーチンは、coroutine.yieldcoroutine.yield()を参照)を呼び出すことでyieldします。コルーチンがyieldすると、対応するcoroutine.resumeは、yieldがネストされた関数呼び出しの内側で発生した場合(つまり、メイン関数ではなく、メイン関数によって直接的または間接的に呼び出された関数の場合)でも、すぐに戻ります。yieldの場合、coroutine.resumetrueと、coroutine.yieldに渡されたすべての値を返します。同じコルーチンを次に再開すると、yieldしたポイントから実行を継続し、coroutine.yieldの呼び出しは、coroutine.resumeに渡された追加の引数を返します。
coroutine.createと同様に、coroutine.wrap関数(coroutine.wrap()を参照)もコルーチンを作成しますが、コルーチン自体を返す代わりに、呼び出すとコルーチンを再開する関数を返します。この関数に渡されたすべての引数は、coroutine.resumeへの追加の引数として渡されます。coroutine.wrapは、最初の引数(ブールエラーコード)を除き、coroutine.resumeによって返されたすべての値を返します。coroutine.resumeとは異なり、coroutine.wrapはエラーをキャッチしません。エラーはすべて呼び出し元に伝播されます。
例として、次のコードを考えてみましょう
function foo1 (a)
  print("foo", a)
  return coroutine.yield(2*a)
end
co = coroutine.create(function (a,b)
      print("co-body", a, b)
      local r = foo1(a+1)
      print("co-body", r)
      local r, s = coroutine.yield(a+b, a-b)
      print("co-body", r, s)
      return b, "end"
end)
print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, "r"))
print("main", coroutine.resume(co, "x", "y"))
print("main", coroutine.resume(co, "x", "y"))
実行すると、次の出力が生成されます
co-body 1       10
foo     2
main    true    4
co-body r
main    true    11      -9
co-body x       y
main    true    10      end
main    false   cannot resume dead coroutine

3 アプリケーションプログラムインターフェース lua-API

このセクションでは、LuaのC API(つまり、ホストプログラムがLuaと通信するために利用できるC関数のセット)について説明します。すべてのAPI関数と関連する型と定数は、ヘッダーファイルlua.hで宣言されています。
"関数"という用語を使用している場合でも、API内のすべての機能はmacroとして提供される場合があります。このようなマクロはすべて、各引数を正確に1回使用します(最初の引数は常にLuaの状態であるため、除く)。したがって、隠れた副作用は生成されません。
ほとんどのCライブラリと同様に、Lua API関数は、引数の有効性または一貫性をチェックしません。ただし、ファイルluaconf.hでマクロluai_apicheckに適切な定義をしてLuaをコンパイルすることで、この動作を変更できます。

3.1 スタック lua-stack lua-apiStack

Luaは、Cとの間で値をやり取りするために仮想スタックを使用します。このスタック内の各要素は、Luaの値(nil、数値、文字列など)を表します。
LuaがCを呼び出すたびに、呼び出された関数は新しいスタックを取得します。このスタックは、前のスタックや、まだアクティブなC関数のスタックとは独立しています。このスタックには、最初はC関数へのすべての引数が含まれており、C関数が呼び出し元に返される結果をプッシュする場所です(lua_CFunctionを参照)。
lua-stackindex
便宜上、APIのほとんどのクエリ操作は、厳密なスタック規律に従いません。代わりに、インデックスを使用してスタック内の任意の要素を参照できます。正のインデックスは、絶対スタック位置(1から開始)を表します。負のインデックスは、スタックの最上部からのオフセットを表します。具体的には、スタックにn個の要素がある場合、インデックス1は最初の要素(つまり、最初にスタックにプッシュされた要素)を表し、インデックスnは最後の要素を表します。インデックス-1も最後の要素(つまり、最上部の要素)を表し、インデックス-nは最初の要素を表します。インデックスが1とスタックトップの間にある場合(つまり、1 <= abs(index) <= topの場合)、有効であると言います。

3.2 スタックサイズ lua-apiStackSize

Lua APIと対話するときは、一貫性を確保する責任があります。特に、スタックオーバーフローを制御する責任があります。関数lua_checkstackを使用して、スタックサイズを拡大できます(lua_checkstack()を参照)。
LuaがCを呼び出すときは常に、少なくともLUA_MINSTACK個のスタック位置が使用可能であることを保証します。LUA_MINSTACKは20として定義されているため、コードがスタックに要素をプッシュするループがない限り、通常はスタック領域を心配する必要はありません。
ほとんどのクエリ関数は、使用可能なスタック領域内の任意の値をインデックスとして受け入れます。つまり、lua_checkstackを使用して設定した最大スタックサイズまでのインデックスです。このようなインデックスは、許容可能なインデックスと呼ばれます。より正式には、許容可能なインデックスを次のように定義します。
(index < 0 && abs(index) <= top) || (index > 0 && index <= stackspace)
0は許容可能なインデックスではないことに注意してください。

3.3 擬似インデックス lua-pseudoindex

特に明記されていない限り、有効なインデックスを受け入れる関数はすべて、スタックにはないがCコードからアクセスできるいくつかのLua値を表す擬似インデックスで呼び出すこともできます。擬似インデックスは、スレッド環境、関数環境、レジストリ、およびC関数のアップ値にアクセスするために使用されます(lua-cclosureを参照)。
スレッド環境(グローバル変数が存在する場所)は、常に擬似インデックスLUA_GLOBALSINDEXにあります。実行中のC関数の環境は、常に擬似インデックスLUA_ENVIRONINDEXにあります。
グローバル変数の値にアクセスして変更するには、環境テーブルに対する通常のテーブル操作を使用できます。たとえば、グローバル変数の値にアクセスするには、次のようにします。
lua_getfield(L, LUA_GLOBALSINDEX, varname);

3.4 Cクロージャ lua-cclosure

C関数が作成されるとき、いくつかの値をそれに関連付けることができ、それによってCクロージャが作成されます。これらの値はアップバリューと呼ばれ、関数が呼び出されるたびにアクセスできます(lua_pushcclosure()を参照)。
C関数が呼び出されるときは常に、そのアップバリューは特定の擬似インデックスに配置されます。これらの擬似インデックスは、マクロlua_upvalueindexによって生成されます。関数に関連付けられた最初の値は、位置lua_upvalueindex(1)にあり、以下同様です。lua_upvalueindex( n )へのアクセスは、nが現在の関数のアップバリューの数より大きい場合、許容される(が無効な)インデックスを生成します。

3.5 レジストリ lua-registry

Luaは、任意のCコードがLua値を格納するために使用できる、事前に定義されたテーブルであるレジストリを提供します。このテーブルは、常に擬似インデックスLUA_REGISTRYINDEXに配置されます。任意のCライブラリがこのテーブルにデータを格納できますが、他のライブラリで使用されるキーと異なるキーを選択して、衝突を避けるように注意する必要があります。通常、ライブラリ名を含む文字列、またはコード内のCオブジェクトのアドレスを持つライトuserdataをキーとして使用する必要があります。
レジストリの整数キーは、補助ライブラリによって実装された参照メカニズムで使用されるため、他の目的で使用しないでください。

3.6 Cでのエラー処理 lua-apiError

内部的には、LuaはCのlongjmp機能を使用してエラーを処理します。(C++を使用している場合は、例外を使用することもできます。luaconf.hファイルを参照してください。)Luaがエラー(メモリ割り当てエラー、型エラー、構文エラー、ランタイムエラーなど)に直面すると、エラーが発生します。つまり、long jumpを実行します。保護された環境では、setjmpを使用してリカバリポイントを設定します。エラーは、最新のアクティブなリカバリポイントにジャンプします。
たとえば、メモリ割り当てエラーが原因で、API内のほぼすべての関数がエラーを発生させる可能性があります。次の関数は保護モード(つまり、実行する保護された環境を作成します)で実行されるため、エラーが発生することはありません:lua_newstatelua_closelua_loadlua_pcall、およびlua_cpcalllua_newstate()lua_close()lua_load()lua_pcall()、およびlua_cpcall()を参照)。
C関数内で、lua_errorを呼び出すことによってエラーを発生させることができます(lua_error()を参照)。

3.7 関数と型 lua-apiFunctions

ここでは、C APIのすべての関数と型をアルファベット順にリストします。
lua_Alloc lua_Alloc
typedef void * (*lua_Alloc) (void *ud,
                             void *ptr,
                             size_t osize,
                             size_t nsize);
Luaステートによって使用されるメモリ割り当て関数の型。アロケータ関数は、reallocと同様の機能を提供する必要がありますが、まったく同じではありません。その引数は、udlua_newstateに渡される不透明なポインタ(lua_newstate()を参照)、ptr、割り当て/再割り当て/解放されるブロックへのポインタ、osize、ブロックの元のサイズ、nsize、ブロックの新しいサイズです。ptrは、osizeがゼロの場合にのみNULLになります。nsizeがゼロの場合、アロケータはNULLを返す必要があります。osizeがゼロでない場合は、ptrが指すブロックを解放する必要があります。nsizeがゼロでない場合、アロケータはリクエストを満たすことができない場合にのみNULLを返します。nsizeがゼロではなく、osizeがゼロの場合、アロケータはmallocのように動作する必要があります。nsizeosizeがゼロでない場合、アロケータはreallocのように動作します。Luaは、`osize >= nsize`の場合、アロケータが失敗することはないと想定しています。
これは、アロケータ関数の簡単な実装です。補助ライブラリでluaL_newstateによって使用されます(luaL_newstate()を参照)。
static void *l_alloc (void *ud, void *ptr, size_t osize,
                                           size_t nsize) {
  (void)ud;  (void)osize;  /* not used */
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else
    return realloc(ptr, nsize);
}
このコードは、free(NULL)には効果がなく、realloc(NULL, size)malloc(size)と同等であることを前提としています。ANSI Cは両方の動作を保証します。
lua_atpanic lua_atpanic()
lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);
新しいパニック関数を設定し、古い関数を返します。
保護された環境の外でエラーが発生した場合、Luaはpanic functionを呼び出し、次にexit(EXIT_FAILURE)を呼び出して、ホストアプリケーションを終了します。パニック関数は、決して戻らない(たとえば、long jumpを実行する)ことで、この終了を回避できます。
パニック関数は、スタックの最上部にあるエラーメッセージにアクセスできます。
lua_call lua_call()
void lua_call (lua_State *L, int nargs, int nresults);
関数を呼び出します。
関数を呼び出すには、次のプロトコルを使用する必要があります。まず、呼び出す関数をスタックにプッシュします。次に、関数の引数を直接の順序でプッシュします。つまり、最初の引数が最初にプッシュされます。最後に、lua_callを呼び出します。nargsは、スタックにプッシュした引数の数です。すべての引数と関数の値は、関数が呼び出されるときにスタックからポップされます。関数の結果は、関数が戻るときにスタックにプッシュされます。結果の数はnresultsに調整されます。ただし、nresultsLUA_MULTRETの場合は除きます。この場合、関数からのallの結果がプッシュされます。Luaは、返された値がスタックスペースに収まるようにします。関数の結果は直接の順序でスタックにプッシュされます(最初の結果が最初にプッシュされます)。したがって、呼び出し後、最後の結果がスタックの最上部にあります。
呼び出された関数内のエラーはすべて、(longjmpで)上位に伝播されます。
次の例は、ホストプログラムがこのLuaコードと同等のことを行う方法を示しています
a = f("how", t.x, 14)
Cでは次のようになります
lua_getfield(L, LUA_GLOBALSINDEX, "f"); // function to be called
lua_pushstring(L, "how");                        // 1st argument
lua_getfield(L, LUA_GLOBALSINDEX, "t");   // table to be indexed
lua_getfield(L, -1, "x");        // push result of t.x (2nd arg)
lua_remove(L, -2);                  // remove 't' from the stack
lua_pushinteger(L, 14);                          // 3rd argument
lua_call(L, 3, 1);     // call 'f' with 3 arguments and 1 result
lua_setfield(L, LUA_GLOBALSINDEX, "a");        // set global 'a'
上記のコードは「バランスが取れている」ことに注意してください。終了時に、スタックは元の構成に戻ります。これは、優れたプログラミングプラクティスと見なされています。
lua_CFunction lua-cfunction lua_CFunction
typedef int (*lua_CFunction) (lua_State *L);
C関数の型。
Luaと適切に通信するために、C関数は、パラメータと結果が渡される方法を定義する次のプロトコルを使用する必要があります。C関数は、Luaからスタック内の引数を直接の順序で受け取ります(最初の引数が最初にプッシュされます)。したがって、関数が開始されると、lua_gettop(L)lua_gettop()を参照)は関数が受け取った引数の数を返します。最初の引数(存在する場合)はインデックス1にあり、最後の引数はインデックスlua_gettop(L)にあります。Luaに値を返すには、C関数はそれらをスタックに直接の順序でプッシュし(最初の結果が最初にプッシュされます)、結果の数を返します。結果の下にあるスタック内の他の値はすべて、Luaによって適切に破棄されます。Lua関数のように、Luaによって呼び出されるC関数も多くの結果を返すことができます。
lua-cfunctionexample
例として、次の関数は可変個数の数値引数を受け取り、その平均と合計を返します
static int foo (lua_State *L) {
  int n = lua_gettop(L);    /* number of arguments */
  lua_Number sum = 0;
  int i;
  for (i = 1; i &lt;= n; i++) {
    if (!lua_isnumber(L, i)) {
      lua_pushstring(L, "incorrect argument");
      lua_error(L);
    }
    sum += lua_tonumber(L, i);
  }
  lua_pushnumber(L, sum/n); /* first result */
  lua_pushnumber(L, sum);   /* second result */
  return 2;                 /* number of results */
}
lua_checkstack lua_checkstack()
int lua_checkstack (lua_State *L, int extra);
スタックに少なくともextra個の空きスタックスロットがあることを確認します。スタックをそのサイズまで拡張できない場合は、falseを返します。この関数はスタックを縮小しません。スタックが新しいサイズよりすでに大きい場合、変更されずに残されます。
lua_close lua_close()
void lua_close (lua_State *L);
指定されたLuaステート内のすべてのオブジェクトを破棄し(対応するガベージコレクションメタメソッドがある場合はそれを呼び出し)、このステートで使用されるすべての動的メモリを解放します。一部のプラットフォームでは、ホストプログラムが終了するとすべてのリソースが自然に解放されるため、この関数を呼び出す必要がない場合があります。一方、デーモンやWebサーバーなどの長時間実行されるプログラムでは、大きくなりすぎないように、不要になったらすぐにステートを解放する必要がある場合があります。
lua_concat lua_concat()
void lua_concat (lua_State *L, int n);
スタックの最上部にあるn個の値を連結し、それらをポップして、結果を最上部に残します。nが1の場合、結果はスタック上の単一の文字列です(つまり、関数は何もしません)。nが0の場合、結果は空の文字列です。連結は、Luaの通常のセマンティクスに従って行われます(lua-concatを参照)。
lua_cpcall lua_cpcall()
int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
C関数funcを保護モードで呼び出します。funcは、スタックに1つの要素(udを含むライトuserdata)のみで開始します。エラーの場合、lua_cpcalllua_pcallと同じエラーコードを返し(lua_pcall()を参照)、スタックの最上部にエラーオブジェクトが追加されます。それ以外の場合は、ゼロを返し、スタックを変更しません。funcによって返されたすべての値は破棄されます。
lua_createtable lua_createtable()
void lua_createtable (lua_State *L, int narr, int nrec);
新しい空のテーブルを作成し、スタックにプッシュします。新しいテーブルには、narr個の配列要素とnrec個の非配列要素用に事前割り当てられたスペースがあります。この事前割り当ては、テーブルが持つ要素の数を正確に知っている場合に役立ちます。それ以外の場合は、関数lua_newtableを使用できます(lua_newtable()を参照)。
lua_dump lua_dump()
int lua_dump (lua_State *L, lua_Writer writer, void *data);
関数をバイナリチャンクとしてダンプします。スタックの最上部にあるLua関数を受け取り、再度ロードされた場合にダンプされたものと同等の関数になるバイナリチャンクを生成します。チャンクの一部を生成するときに、lua_dumpは指定されたdataを使用して関数writerlua_Writerを参照)を呼び出してそれらを書き込みます。
戻り値は、ライターへの最後の呼び出しによって返されたエラーコードです。0はエラーがないことを意味します。
この関数は、スタックからLua関数をポップしません。
lua_equal lua_equal()
int lua_equal (lua_State *L, int index1, int index2);
許容可能なインデックスindex1index2にある2つの値が、Luaの==演算子のセマンティクス(つまり、メタメソッドを呼び出す可能性がある)に従って等しい場合は1を返します。それ以外の場合は0を返します。また、いずれかのインデックスが無効な場合は0を返します。
lua_error lua_error()
int lua_error (lua_State *L);
Luaエラーを生成します。エラーメッセージ(実際には任意の型のLua値でもかまいません)はスタックの最上位になければなりません。この関数はロングジャンプを実行するため、決して戻りません(luaL_error()を参照)。
lua_gc lua_gc()
int lua_gc (lua_State *L, int what, int data);
ガベージコレクタを制御します。
この関数は、パラメータwhatの値に応じて、いくつかのタスクを実行します。
LUA_GCSTOP はガベージコレクタを停止します。
LUA_GCRESTART はガベージコレクタを再起動します。
LUA_GCCOLLECT は完全なガベージコレクションサイクルを実行します。
LUA_GCCOUNT は、Luaが使用している現在のメモリ量(キロバイト単位)を返します。
LUA_GCCOUNTB は、Luaが使用している現在のメモリ量(バイト単位)を1024で割った余りを返します。
LUA_GCSTEP は、ガベージコレクションの増分ステップを実行します。ステップの「サイズ」はdataによって(明示されない方法で)制御されます(大きい値はより多くのステップを意味します)。ステップサイズを制御したい場合は、dataの値を実験的に調整する必要があります。関数は、ステップがガベージコレクションサイクルを完了した場合は1を返します。
LUA_GCSETPAUSE は、コレクタのpauseの新しい値としてdata /100を設定します(lua-gcを参照)。関数は、pauseの前の値を返します。
LUA_GCSETSTEPMUL は、コレクタのstep multiplierの新しい値としてdata /100を設定します(lua-gcを参照)。関数は、ステップマルチプライヤの前の値を返します。
lua_getallocf lua_getallocf()
lua_Alloc lua_getallocf (lua_State *L, void **ud);
指定された状態のメモリアロケーション関数を返します。udNULLでない場合、Luaは*udlua_newstateに渡された不透明なポインタを格納します(lua_newstate()を参照)。
lua_getfenv lua_getfenv()
void lua_getfenv (lua_State *L, int index);
指定されたインデックスにある値の環境テーブルをスタックにプッシュします。
lua_getfield lua_getfield()
void lua_getfield (lua_State *L, int index, const char *k);
スタックに値t[k]をプッシュします。ここで、tは、指定された有効なインデックスindexの値です。Luaと同様に、この関数は「インデックス」イベントのメタメソッドをトリガーする可能性があります(lua-metatableを参照)。
lua_getglobal lua_getglobal()
void lua_getglobal (lua_State *L, const char *name);
グローバル変数nameの値をスタックにプッシュします。これはマクロとして定義されています。
#define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)
lua_getmetatable lua_getmetatable()
int lua_getmetatable (lua_State *L, int index);
指定された許容可能なインデックスにある値のメタテーブルをスタックにプッシュします。インデックスが無効な場合、または値にメタテーブルがない場合、関数は0を返し、スタックに何もプッシュしません。
lua_gettable lua_gettable()
void lua_gettable (lua_State *L, int index);
スタックに値t[k]をプッシュします。ここで、tは指定された有効なインデックスindexの値で、kはスタックの最上位にある値です。
この関数は、スタックからキーをポップします(結果の値をその場所に配置します)。Luaと同様に、この関数は「インデックス」イベントのメタメソッドをトリガーする可能性があります(lua-metatableを参照)。
lua_gettop lua_gettop()
int lua_gettop (lua_State *L);
スタックの最上位要素のインデックスを返します。インデックスは1から始まるため、この結果はスタック内の要素の数と同じです(したがって、0は空のスタックを意味します)。
lua_insert lua_insert()
void lua_insert (lua_State *L, int index);
最上位の要素を指定された有効なインデックスに移動し、このインデックスより上の要素を上にシフトしてスペースを開きます。疑似インデックスは実際のスタック位置ではないため、疑似インデックスを使用して呼び出すことはできません。
lua_Integer lua_Integer
typedef ptrdiff_t lua_Integer;
Lua APIが整数値を表すために使用する型です。
デフォルトでは、ptrdiff_tです。これは通常、マシンが「快適に」処理する最大の整数型です。
lua_isboolean lua_isboolean()
int lua_isboolean (lua_State *L, int index);
指定された許容可能なインデックスの値がブール型の場合は1を、それ以外の場合は0を返します。
lua_iscfunction lua_iscfunction()
int lua_iscfunction (lua_State *L, int index);
指定された許容可能なインデックスの値がC関数の場合は1を、それ以外の場合は0を返します。
lua_isfunction lua_isfunction()
int lua_isfunction (lua_State *L, int index);
指定された許容可能なインデックスの値が関数(CまたはLua)の場合は1を、それ以外の場合は0を返します。
lua_islightuserdata lua_islightuserdata()
int lua_islightuserdata (lua_State *L, int index);
指定された許容可能なインデックスの値がライトユーザデータの場合は1を、それ以外の場合は0を返します。
lua_isnil lua_isnil()
int lua_isnil (lua_State *L, int index);
指定された許容可能なインデックスの値がnilの場合は1を、それ以外の場合は0を返します。
lua_isnumber lua_isnumber()
int lua_isnumber (lua_State *L, int index);
指定された許容可能なインデックスの値が数値または数値に変換可能な文字列の場合は1を、それ以外の場合は0を返します。
lua_isstring lua_isstring()
int lua_isstring (lua_State *L, int index);
指定された許容可能なインデックスの値が文字列または数値(常に文字列に変換可能)の場合は1を、それ以外の場合は0を返します。
lua_istable lua_istable()
int lua_istable (lua_State *L, int index);
指定された許容可能なインデックスの値がテーブルの場合は1を、それ以外の場合は0を返します。
lua_isthread lua_isthread()
int lua_isthread (lua_State *L, int index);
指定された許容可能なインデックスの値がスレッドの場合は1を、それ以外の場合は0を返します。
lua_isuserdata lua_isuserdata()
int lua_isuserdata (lua_State *L, int index);
指定された許容可能なインデックスの値がユーザデータ(フルまたはライト)の場合は1を、それ以外の場合は0を返します。
lua_lessthan lua_lessthan()
int lua_lessthan (lua_State *L, int index1, int index2);
許容可能なインデックスindex1の値が、Luaの<演算子のセマンティクスに従って(つまり、メタメソッドを呼び出す可能性がある)、許容可能なインデックスindex2の値よりも小さい場合は1を返します。それ以外の場合は0を返します。また、いずれかのインデックスが無効な場合は0を返します。
lua_load lua_load()
int lua_load (lua_State *L,
              lua_Reader reader,
              void *data,
              const char *chunkname);
Luaチャンクをロードします。エラーがない場合、lua_loadはコンパイルされたチャンクをLua関数としてスタックの最上位にプッシュします。それ以外の場合は、エラーメッセージをプッシュします。lua_loadの戻り値は次のとおりです。
0:エラーなし;
LUA_ERRSYNTAX:プリコンパイル中の構文エラー;
LUA_ERRMEM:メモリ割り当てエラー。
この関数はチャンクをロードするだけで、実行はしません。
lua_loadは、チャンクがテキストかバイナリかを自動的に検出し、それに応じてロードします(プログラムluacを参照)。
lua_load関数は、チャンクを読み込むためにユーザ提供のreader関数を使用します(lua_Readerを参照)。data引数は、リーダー関数に渡される不透明な値です。
chunkname引数は、エラーメッセージやデバッグ情報で使用されるチャンクに名前を付けます(lua-apiDebugを参照)。
lua_newstate lua_newstate()
lua_State *lua_newstate (lua_Alloc f, void *ud);
新しい独立した状態を作成します。状態を作成できない場合(メモリ不足のため)、NULLを返します。引数fはアロケータ関数です。Luaはこの状態のすべてのメモリアロケーションをこの関数を通して行います。2番目の引数udは不透明なポインタであり、Luaはすべての呼び出しでアロケータに渡すだけです。
lua_newtable lua_newtable()
void lua_newtable (lua_State *L);
新しい空のテーブルを作成し、スタックにプッシュします。これはlua_createtable(L, 0, 0)lua_createtable()を参照)と同等です。
lua_newthread lua_newthread()
lua_State *lua_newthread (lua_State *L);
新しいスレッドを作成し、スタックにプッシュして、この新しいスレッドを表すlua_Statelua_Stateを参照)へのポインタを返します。この関数によって返される新しい状態は、グローバルオブジェクト(テーブルなど)を元の状態と共有しますが、独立した実行スタックを持ちます。
スレッドを閉じるまたは破棄するための明示的な関数はありません。スレッドは、他のLuaオブジェクトと同様にガベージコレクションの対象です。
lua_newuserdata lua_newuserdata()
void *lua_newuserdata (lua_State *L, size_t size);
この関数は、指定されたサイズの新しいメモリブロックを割り当て、ブロックアドレスを持つ新しいフルユーザデータをスタックにプッシュし、このアドレスを返します。userdata
ユーザデータはLuaのC値を表します。フルユーザデータはメモリブロックを表します。これはオブジェクト(テーブルのような)です。作成する必要があり、独自のメタテーブルを持つことができ、コレクションされるタイミングを検出できます。フルユーザデータは、それ自体とのみ等しくなります(生の等価性下)。
Luaがgcメタメソッドを持つフルユーザデータをコレクションすると、Luaはメタメソッドを呼び出し、ユーザデータをファイナライズ済みとしてマークします。このユーザデータが再度コレクションされると、Luaはその対応するメモリを解放します。
lua_next lua_next()
int lua_next (lua_State *L, int index);
スタックからキーをポップし、指定されたインデックスにあるテーブルからキーと値のペア(指定されたキーの「次の」ペア)をプッシュします。テーブルに要素がもうない場合、lua_nextは0を返し(何もプッシュしません)。
lua-テーブル走査
一般的な走査は次のようになります。
/* table is in the stack at index 't' */
lua_pushnil(L);  /* first key */
while (lua_next(L, t) != 0) {
  /* uses 'key' (at index -2) and 'value' (at index -1) */
  printf("%s - %s\n",
         lua_typename(L, lua_type(L, -2)),
         lua_typename(L, lua_type(L, -1)));
  /* removes 'value'; keeps 'key' for next iteration */
  lua_pop(L, 1);
}
テーブルを走査する際、キーが実際には文字列であることがわかっている場合を除き、キーに対して直接lua_tolstringlua_tolstring()を参照)を呼び出さないでください。lua_tolstringは指定されたインデックスの値を変更することを思い出してください。これはlua_nextの次の呼び出しを混乱させます。
lua_Number lua_Number
typedef double lua_Number;
Luaにおける数値の型。デフォルトではdoubleですが、luaconf.hで変更できます。
構成ファイルを通じて、Luaが数値に別の型(例:floatまたはlong)で動作するように変更できます。
lua_objlen lua_objlen()
size_t lua_objlen (lua_State *L, int index);
指定された有効なインデックスの値の「長さ」を返します。文字列の場合は文字列の長さ、テーブルの場合は長さ演算子(#)の結果、userdataの場合はuserdataに割り当てられたメモリブロックのサイズ、その他の値の場合は0です。
lua_pcall lua_pcall()
lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
保護モードで関数を呼び出します。
nargsnresultsの両方は、lua_calllua_call()を参照)と同じ意味を持ちます。呼び出し中にエラーがない場合、lua_pcalllua_callとまったく同じように動作します。ただし、エラーがある場合、lua_pcallはそれをキャッチし、スタックに単一の値(エラーメッセージ)をプッシュし、エラーコードを返します。lua_callと同様に、lua_pcallは常にスタックから関数とその引数を削除します。
errfuncが0の場合、スタックに返されるエラーメッセージは元のエラーメッセージとまったく同じです。それ以外の場合、errfuncerror ハンドラ関数のスタックインデックスです。(現在の実装では、このインデックスは擬似インデックスにはできません。)実行時エラーの場合、この関数はエラーメッセージとともに呼び出され、その戻り値はlua_pcallによってスタックに返されるメッセージになります。
通常、エラーハンドラ関数は、スタックトレースなどのより多くのデバッグ情報をエラーメッセージに追加するために使用されます。そのような情報はlua_pcallの戻り後には収集できません。その時点までにスタックが巻き戻されるためです。
lua_pcall関数は、成功した場合は0を返し、次のエラーコード(lua.hで定義)のいずれかを返します。
LUA_ERRRUN ランタイムエラー。
LUA_ERRMEM メモリ割り当てエラー。このようなエラーの場合、Luaはエラーハンドラ関数を呼び出しません。
LUA_ERRERR エラーハンドラ関数の実行中のエラー。
lua_pop lua_pop()
void lua_pop (lua_State *L, int n);
スタックからn個の要素をポップします。
lua_pushboolean lua_pushboolean()
void lua_pushboolean (lua_State *L, int b);
bを持つブール値をスタックにプッシュします。
lua_pushcclosure lua_pushcclosure()
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
新しいCクロージャをスタックにプッシュします。
C関数を作成するとき、いくつかの値をそれに関連付け、それによってCクロージャを作成できます(lua-cclosureを参照)。これらの値は、関数が呼び出されるたびにアクセスできます。C関数に値を関連付けるには、まずこれらの値をスタックにプッシュする必要があります(複数の値がある場合は、最初の値が最初にプッシュされます)。次に、lua_pushcclosureを呼び出して、C関数を作成してスタックにプッシュします。引数nは、関数に関連付ける必要がある値の数を伝えます。lua_pushcclosureは、これらの値もスタックからポップします。
lua_pushcfunction lua_pushcfunction()
void lua_pushcfunction (lua_State *L, lua_CFunction f);
C関数をスタックにプッシュします。この関数は、C関数へのポインタを受け取り、呼び出されると対応するC関数を呼び出す、function型のLua値をスタックにプッシュします。
Luaに登録するすべての関数は、パラメータを受け取り結果を返すための正しいプロトコルに従う必要があります(lua_CFunctionを参照)。
lua_pushcfunctionはマクロとして定義されています
#define lua_pushcfunction(L,f)  lua_pushcclosure(L,f,0)
lua_pushfstring lua_pushfstring()
const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
フォーマットされた文字列をスタックにプッシュし、この文字列へのポインタを返します。C関数のsprintfに似ていますが、いくつかの重要な違いがあります。
結果の領域を割り当てる必要はありません。結果はLua文字列であり、Luaがメモリ割り当て(およびガベージコレクションによる割り当て解除)を行います。
変換指定子は非常に制限されています。フラグ、幅、精度はありません。変換指定子は、%%(文字列に%を挿入)、%s(サイズ制限なしで、ゼロ終端文字列を挿入)、%flua_Numberを挿入)、%p(ポインタを16進数で挿入)、%dintを挿入)、および%cintを文字として挿入)のみです。
lua_pushinteger lua_pushinteger()
void lua_pushinteger (lua_State *L, lua_Integer n);
nを持つ数値をスタックにプッシュします。
lua_pushlightuserdata lua_pushlightuserdata()
void lua_pushlightuserdata (lua_State *L, void *p);
ライトuserdataをスタックにプッシュします。lua-lightuserdata
userdataはLuaにおけるC値を表します。ライトuserdataはポインタを表します。これは(数値のような)値です。作成するものではなく、個別のメタテーブルはなく、収集されません(作成されたことがないため)。ライトuserdataは、同じCアドレスを持つ「任意の」ライトuserdataと等しくなります。
lua_pushlstring lua_pushlstring()
void lua_pushlstring (lua_State *L, const char *s, size_t len);
サイズlensが指す文字列をスタックにプッシュします。Luaは与えられた文字列の内部コピーを作成(または再利用)するため、関数が返った直後にsのメモリを解放または再利用できます。文字列には埋め込まれたゼロを含めることができます。
lua_pushnil lua_pushnil()
void lua_pushnil (lua_State *L);
nil値をスタックにプッシュします。
lua_pushnumber lua_pushnumber()
void lua_pushnumber (lua_State *L, lua_Number n);
nを持つ数値をスタックにプッシュします。
lua_pushstring lua_pushstring()
void lua_pushstring (lua_State *L, const char *s);
sが指すゼロ終端文字列をスタックにプッシュします。Luaは与えられた文字列の内部コピーを作成(または再利用)するため、関数が返った直後にsのメモリを解放または再利用できます。文字列に埋め込まれたゼロを含めることはできません。最初のゼロで終了すると想定されています。
lua_pushthread lua_pushthread()
int lua_pushthread (lua_State *L);
Lで表されるスレッドをスタックにプッシュします。このスレッドがその状態のメインスレッドである場合は1を返します。
lua_pushvalue lua_pushvalue()
void lua_pushvalue (lua_State *L, int index);
指定された有効なインデックスにある要素のコピーをスタックにプッシュします。
lua_pushvfstring lua_pushvfstring()
const char *lua_pushvfstring (lua_State *L,
                              const char *fmt,
                              va_list argp);
可変数の引数の代わりにva_listを受け取ることを除いて、lua_pushfstringlua_pushfstring()を参照)と同等です。
lua_rawequal lua_rawequal()
int lua_rawequal (lua_State *L, int index1, int index2);
許容可能なインデックスindex1index2の2つの値が(メタメソッドを呼び出さずに)原始的に等しい場合は1を返します。それ以外の場合は0を返します。インデックスのいずれかが無効な場合も0を返します。
lua_rawget lua_rawget()
void lua_rawget (lua_State *L, int index);
lua_gettablelua_gettable()を参照)と似ていますが、生のアクセス(つまり、メタメソッドなし)を行います。
lua_rawgeti lua_rawgeti()
void lua_rawgeti (lua_State *L, int index, int n);
スタックに値t[n]をプッシュします。ここで、tは指定された有効なインデックスindexの値です。アクセスは生です。つまり、メタメソッドを呼び出しません。
lua_rawset lua_rawset()
void lua_rawset (lua_State *L, int index);
lua_settablelua_settable()を参照)と似ていますが、生の代入(つまり、メタメソッドなし)を行います。
lua_rawseti lua_rawseti()
void lua_rawseti (lua_State *L, int index, int n);
t[n] = vと同等の処理を行います。ここで、tは指定された有効なインデックスindexの値であり、vはスタックの最上部の値です。
この関数はスタックから値をポップします。代入は生です。つまり、メタメソッドを呼び出しません。
lua_Reader lua_Reader
typedef const char * (*lua_Reader) (lua_State *L,
                                    void *data,
                                    size_t *size);
lua_loadlua_load()を参照)で使用されるリーダー関数。lua_loadは、チャンクの別の部分が必要になるたびに、リーダーを呼び出し、そのdataパラメータを渡します。リーダーは、チャンクの新しい部分を含むメモリブロックへのポインタを返し、sizeをブロックサイズに設定する必要があります。ブロックは、リーダー関数が再度呼び出されるまで存在する必要があります。チャンクの終わりを通知するには、リーダーはNULLを返す必要があります。リーダー関数は、ゼロより大きい任意のサイズのチャンクを返すことができます。
lua_register lua_register()
void lua_register (lua_State *L,
                   const char *name,
                   lua_CFunction f);
C関数fをグローバルnameの新しい値として設定します。これはマクロとして定義されています
#define lua_register(L,n,f) \
       (lua_pushcfunction(L, f), lua_setglobal(L, n))
lua_remove lua_remove()
void lua_remove (lua_State *L, int index);
指定された有効なインデックスにある要素を削除し、このインデックスの上の要素を下にシフトしてギャップを埋めます。擬似インデックスは実際のスタック位置ではないため、擬似インデックスを使用して呼び出すことはできません。
lua_replace lua_replace()
void lua_replace (lua_State *L, int index);
(ポップして)最上部の要素を指定された位置に移動します。要素をシフトすることはないため、(したがって、指定された位置の値を置き換えます)。
lua_resume lua_resume()
int lua_resume (lua_State *L, int narg);
指定されたスレッドでコルーチンを開始および再開します。
コルーチンを開始するには、まず新しいスレッドを作成します(lua_newthread()を参照)。次に、そのスタックにメイン関数と引数をプッシュします。次に、nargが引数の数であるlua_resumelua_resume()を参照)を呼び出します。この呼び出しは、コルーチンが中断または実行を終了すると返ります。返るとき、スタックにはlua_yieldlua_yield()を参照)に渡されたすべての値、または本体関数によって返されたすべての値が含まれます。lua_resumeは、コルーチンが中断した場合はLUA_YIELDを返し、コルーチンがエラーなしで実行を終了した場合は0を返し、エラーの場合はエラーコードを返します(lua_pcall()を参照)。エラーの場合、スタックは巻き戻されないため、その上でデバッグAPIを使用できます。エラーメッセージはスタックの一番上にあります。コルーチンを再開するには、lua_yieldからの結果として渡す値をそのスタックに配置し、lua_resumeを呼び出します。
lua_setallocf lua_setallocf()
void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
指定された状態のアロケータ関数を、ユーザーデータudを持つfに変更します。
lua_setfenv lua_setfenv()
int lua_setfenv (lua_State *L, int index);
スタックからテーブルをポップし、指定されたインデックスにある値の新しい環境として設定します。指定されたインデックスの値が関数、スレッド、またはユーザーデータでない場合、lua_setfenv は 0 を返します。それ以外の場合は 1 を返します。
lua_setfield lua_setfield()
void lua_setfield (lua_State *L, int index, const char *k);
t[k] = v と同等の処理を行います。ここで、t は指定された有効なインデックス index にある値、v はスタックの最上位にある値です。
この関数はスタックから値をポップします。Lua と同様に、この関数は "newindex" イベントのメタメソッドをトリガーする可能性があります(lua-metatableを参照)。
lua_setglobal lua_setglobal()
void lua_setglobal (lua_State *L, const char *name);
スタックから値をポップし、グローバル変数 name の新しい値として設定します。これはマクロとして定義されています。
#define lua_setglobal(L,s)   lua_setfield(L, LUA_GLOBALSINDEX, s)
lua_setmetatable lua_setmetatable()
int lua_setmetatable (lua_State *L, int index);
スタックからテーブルをポップし、指定された有効なインデックスにある値の新しいメタテーブルとして設定します。
lua_settable lua_settable()
void lua_settable (lua_State *L, int index);
t[k] = v と同等の処理を行います。ここで、t は指定された有効なインデックス index にある値、v はスタックの最上位にある値、k は最上位のすぐ下にある値です。
この関数は、キーと値の両方をスタックからポップします。Lua と同様に、この関数は "newindex" イベントのメタメソッドをトリガーする可能性があります(lua-metatableを参照)。
lua_settop lua_settop()
void lua_settop (lua_State *L, int index);
任意の有効なインデックス、または 0 を受け取り、スタックの最上位をこのインデックスに設定します。新しい最上位が古いものより大きい場合、新しい要素は nil で埋められます。index が 0 の場合、すべてのスタック要素が削除されます。
lua_State lua_State
typedef struct lua_State lua_State;
Lua インタープリタの全体的な状態を保持する不透明な構造体。Lua ライブラリは完全にリエントラントです。グローバル変数は持ちません。状態に関するすべての情報は、この構造体に保持されます。
この状態へのポインタは、ライブラリ内のすべての関数への最初の引数として渡す必要があります。ただし、lua_newstatelua_newstate()を参照)は例外で、これは Lua の状態をゼロから作成します。
lua_status lua_status()
int lua_status (lua_State *L);
スレッド L のステータスを返します。
ステータスは、通常のスレッドでは 0、スレッドがエラーで実行を終了した場合はエラーコード、スレッドが中断している場合は LUA_YIELD になります。
lua_toboolean lua_toboolean()
int lua_toboolean (lua_State *L, int index);
指定された有効なインデックスにある Lua の値を C のブール値(0 または 1)に変換します。Lua のすべてのテストと同様に、lua_tobooleanfalse および nil 以外の Lua の値に対して 1 を返します。それ以外の場合は 0 を返します。また、無効なインデックスで呼び出された場合も 0 を返します。(実際のブール値のみを受け入れたい場合は、lua_isboolean lua_isboolean() を使用して値の型をテストしてください。)
lua_tocfunction lua_tocfunction()
lua_CFunction lua_tocfunction (lua_State *L, int index);
指定された有効なインデックスにある値を C 関数に変換します。その値は C 関数である必要があります。それ以外の場合は NULL を返します。
lua_tointeger lua_tointeger()
lua_Integer lua_tointeger (lua_State *L, int idx);
指定された有効なインデックスにある Lua の値を符号付き整数型 lua_Integer に変換します(lua_Integerを参照)。Lua の値は、数値または数値に変換可能な文字列である必要があります(lua-coercionを参照)。それ以外の場合、lua_tointeger は 0 を返します。
数値が整数でない場合は、特定されない方法で切り捨てられます。
lua_tolstring lua_tolstring()
const char *lua_tolstring (lua_State *L, int index, size_t *len);
指定された有効なインデックスにある Lua の値を C 文字列に変換します。lenNULL でない場合は、*len に文字列の長さも設定します。Lua の値は、文字列または数値である必要があります。それ以外の場合、関数は NULL を返します。値が数値の場合、lua_tolstring はスタック内の実際の値を文字列に変更します。(この変更は、テーブルのトラバーサル中にキーに lua_tolstring が適用された場合に lua_next lua_next() を混乱させます。)
lua_tolstring は、Lua 状態内の文字列への完全アラインメントされたポインタを返します。この文字列は常に、最後の文字の後にゼロ (\0) がありますが (C の場合と同様)、本体に他のゼロが含まれる場合があります。Lua にはガベージコレクションがあるため、lua_tolstring によって返されるポインタが、対応する値がスタックから削除された後も有効であるという保証はありません。
lua_tonumber lua_tonumber()
lua_Number lua_tonumber (lua_State *L, int index);
指定された有効なインデックスにある Lua の値を C 型 lua_Number に変換します(lua_Numberを参照)。Lua の値は、数値または数値に変換可能な文字列である必要があります(lua-coercionを参照)。それ以外の場合、lua_tonumber は 0 を返します。
lua_topointer lua_topointer()
const void *lua_topointer (lua_State *L, int index);
指定された有効なインデックスにある値を、汎用 C ポインタ (void*) に変換します。値は、ユーザーデータ、テーブル、スレッド、または関数である場合があります。それ以外の場合、lua_topointerNULL を返します。異なるオブジェクトは異なるポインタを提供します。ポインタを元の値に戻す方法はありません。
通常、この関数はデバッグ情報のみに使用されます。
lua_tostring lua_tostring()
const char *lua_tostring (lua_State *L, int index);
lenNULL である lua_tolstringlua_tolstring()を参照)と同等です。
lua_tothread lua_tothread()
lua_State *lua_tothread (lua_State *L, int index);
指定された有効なインデックスにある値を Lua スレッド(lua_State* lua_Stateとして表現)に変換します。この値はスレッドである必要があります。それ以外の場合、関数は NULL を返します。
lua_touserdata lua_touserdata()
void *lua_touserdata (lua_State *L, int index);
指定された有効なインデックスにある値が完全なユーザーデータである場合、そのブロックアドレスを返します。値がライトユーザーデータである場合、そのポインタを返します。それ以外の場合は、NULL を返します。
lua_type lua_type()
int lua_type (lua_State *L, int index);
指定された有効なインデックスにある値の型、または無効なインデックス(つまり、「空の」スタック位置へのインデックス)の場合は LUA_TNONE を返します。lua_type によって返される型は、lua.h で定義されている次の定数によってコード化されます:LUA_TNILLUA_TNUMBERLUA_TBOOLEANLUA_TSTRINGLUA_TTABLELUA_TFUNCTIONLUA_TUSERDATALUA_TTHREAD、および LUA_TLIGHTUSERDATA
lua_typename lua_typename()
const char *lua_typename  (lua_State *L, int tp);
tp でエンコードされた型の名前を返します。tplua_type によって返された値のいずれかである必要があります。
lua_Writer lua_Writer
typedef int (*lua_Writer) (lua_State *L,
                           const void* p,
                           size_t sz,
                           void* ud);
lua_dumplua_dump()を参照)によって使用されるライター関数。lua_dump は、チャンクの別の部分を生成するたびに、書き込むバッファ(p)、そのサイズ(sz)、および lua_dump に渡された data パラメータを渡して、ライターを呼び出します。
ライターはエラーコードを返します。0 はエラーがないことを意味します。その他の値はエラーを意味し、lua_dump がライターを再度呼び出すのを停止します。
lua_xmove lua_xmove()
void lua_xmove (lua_State *from, lua_State *to, int n);
同じグローバル状態の異なるスレッド間で値を交換します。
この関数は、from スタックから n 個の値をポップし、それらを to スタックにプッシュします。
lua_yield lua_yield()
int lua_yield (lua_State *L, int nresults);
コルーチンを中断します。
この関数は、次のように C 関数の戻り式としてのみ呼び出す必要があります。
return lua_yield (L, nresults);
C 関数がそのように lua_yield を呼び出すと、実行中のコルーチンはその実行を中断し、このコルーチンを開始した lua_resumelua_resume()を参照)への呼び出しが返されます。パラメータ nresults は、lua_resume に結果として渡されるスタックからの値の数です。
lua-stackexample
スタック操作の例として、スタックが 10 20 30 40 50*(下から上に。* は最上位を示します)として開始する場合、
lua_pushvalue(L, 3)    --> 10 20 30 40 50 30*
lua_pushvalue(L, -1)   --> 10 20 30 40 50 30 30*
lua_remove(L, -3)      --> 10 20 30 40 30 30*
lua_remove(L,  6)      --> 10 20 30 40 30*
lua_insert(L,  1)      --> 30 10 20 30 40*
lua_insert(L, -1)      --> 30 10 20 30 40*  (no effect)
lua_replace(L, 2)      --> 30 40 20 30*
lua_settop(L, -3)      --> 30 40*
lua_settop(L,  6)      --> 30 40 nil nil nil nil*

3.8 デバッグインターフェイス lua-apiDebug

Lua には組み込みのデバッグ機能はありません。代わりに、関数とフックによる特別なインターフェイスを提供します。このインターフェイスを使用すると、インタープリタからの「内部情報」を必要とするさまざまな種類のデバッガ、プロファイラ、およびその他のツールを構築できます。
lua_Debug lua_Debug
typedef struct lua_Debug {
    int event;
    const char *name;           /* (n) */
    const char *namewhat;       /* (n) */
    const char *what;           /* (S) */
    const char *source;         /* (S) */
    int currentline;            /* (l) */
    int nups;                   /* (u) number of upvalues */
    int linedefined;            /* (S) */
    int lastlinedefined;        /* (S) */
    char short_src[LUA_IDSIZE]; /* (S) */
    /* private part */
    other fields
} lua_Debug;
アクティブな関数に関するさまざまな情報を保持するために使用される構造体。lua_getstacklua_getstack()を参照)は、後で使用するために、この構造体のプライベート部分のみを埋めます。lua_Debug の他のフィールドに役立つ情報を入力するには、lua_getinfolua_getinfo()を参照)を呼び出します。
lua_Debug のフィールドには次の意味があります。
source 関数が文字列で定義されている場合、source はその文字列です。関数がファイルで定義されている場合、source はファイル名が続く @ で始まります。
short_src エラーメッセージで使用される source の「印刷可能な」バージョン。
linedefined 関数の定義が開始される行番号。
lastlinedefined 関数の定義が終了する行番号。
what 関数が Lua 関数である場合は文字列 "Lua"、C 関数である場合は "C"、チャンクのメイン部分である場合は "main"、末尾呼び出しを行った関数である場合は "tail"。後者の場合、Lua は関数に関するその他の情報を持ちません。
currentline 指定された関数が実行されている現在の行。行情報が利用できない場合、currentline は -1 に設定されます。
name 指定された関数の適切な名前。Lua の関数はファーストクラスの値であるため、固定の名前はありません。一部の関数は複数のグローバル変数の値である場合があり、他の関数はテーブルフィールドにのみ格納される場合があります。lua_getinfo 関数は、関数がどのように呼び出されたかを調べて適切な名前を見つけます。名前が見つからない場合、nameNULL に設定されます。
namewhat name フィールドを説明します。namewhat の値は、関数がどのように呼び出されたかに応じて、"global""local""method""field""upvalue"、または ""(空の文字列)になります。(Lua は、他のオプションが適用できないと思われる場合に空の文字列を使用します。)nups 関数のアップバリューの数。
lua_gethook lua_gethook()
lua_Hook lua_gethook (lua_State *L);
現在のフック関数を返します。
lua_gethookcount lua_gethookcount()
int lua_gethookcount (lua_State *L);
現在のフックカウントを返します。
lua_gethookmask lua_gethookmask()
int lua_gethookmask (lua_State *L);
現在のフックマスクを返します。
lua_getinfo lua_getinfo()
int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
特定の関数または関数の呼び出しに関する情報を返します。
関数の呼び出しに関する情報を取得するには、パラメータ ar は、以前の lua_getstacklua_getstack()を参照)の呼び出しによって入力された、またはフック(lua_Hookを参照)への引数として与えられた、有効なアクティベーションレコードである必要があります。
関数に関する情報を取得するには、それをスタックにプッシュし、what 文字列を文字 > で開始します。(その場合、lua_getinfo はスタックの最上位にある関数をポップします。)たとえば、関数 f が定義された行を知るには、次のコードを記述できます。
lua_Debug ar;
lua_getfield(L, LUA_GLOBALSINDEX, "f");  /* get global 'f' */
lua_getinfo(L, ">S", &ar);
printf("%d\n", ar.linedefined);
文字列 what の各文字は、入力される構造体 ar のいくつかのフィールド、またはスタックにプッシュされる値を選択します。
'n'name フィールドを、'S'source, short_src, linedefined, lastlinedefined, および what フィールドを、'l'currentline フィールドを、'u'nups フィールドを、それぞれ埋めます。'f' は指定されたレベルで実行中の関数をスタックにプッシュします。'L' は、関数上で有効な行番号をインデックスとするテーブルをスタックにプッシュします。(ここで言う 有効な行 とは、何らかのコードが関連付けられている行、つまりブレークポイントを設定できる行のことです。無効な行には、空行やコメントが含まれます。)
この関数は、エラー時(例えば、what に無効なオプションが指定された場合)は 0 を返します。
lua_getlocal lua_getlocal()
const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);
指定されたアクティベーションレコードのローカル変数に関する情報を取得します。パラメータ ar は、以前に lua_getstacklua_getstack() を参照)の呼び出しによって埋められた有効なアクティベーションレコード、またはフックへの引数として与えられたものである必要があります(lua_Hook を参照)。インデックス n は、どのローカル変数を検査するかを選択します(1 は最初のパラメータまたはアクティブなローカル変数であり、以降、最後にアクティブなローカル変数まで続きます)。lua_getlocal は変数の値をスタックにプッシュし、その名前を返します。
( (開き括弧) で始まる変数名は、内部変数(ループ制御変数、一時変数、C 関数のローカル変数)を表します。
インデックスがアクティブなローカル変数の数を超える場合は、NULL を返します(何もプッシュしません)。
lua_getstack lua_getstack()
int lua_getstack (lua_State *L, int level, lua_Debug *ar);
インタプリタのランタイムスタックに関する情報を取得します。
この関数は、指定されたレベルで実行中の関数の アクティベーションレコード の識別情報で lua_Debuglua_Debug を参照)構造体の一部を埋めます。レベル 0 は現在実行中の関数であり、レベル n+1 はレベル n を呼び出した関数です。エラーがない場合は、lua_getstack は 1 を返します。スタックの深さよりも大きいレベルで呼び出された場合は、0 を返します。
lua_getupvalue lua_getupvalue()
const char *lua_getupvalue (lua_State *L, int funcindex, int n);
クロージャのアップバリューに関する情報を取得します。(Lua 関数の場合、アップバリューとは、関数が使用し、結果としてそのクロージャに含まれる外部ローカル変数のことです。)lua_getupvalue はアップバリューのインデックス n を取得し、アップバリューの値をスタックにプッシュし、その名前を返します。funcindex はスタック内のクロージャを指します。(アップバリューは関数全体でアクティブであるため、特定の順序を持ちません。そのため、任意の順序で番号が付けられます。)
インデックスがアップバリューの数を超える場合は、NULL を返します(何もプッシュしません)。C 関数の場合、この関数はすべてのアップバリューの名前として空文字列 "" を使用します。
lua_Hook lua_Hook
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
デバッグフック関数の型です。
フックが呼び出されるたびに、その ar 引数の event フィールドには、フックをトリガーした特定のイベントが設定されます。Lua はこれらのイベントを次の定数で識別します: LUA_HOOKCALL, LUA_HOOKRET, LUA_HOOKTAILRET, LUA_HOOKLINE, および LUA_HOOKCOUNT。さらに、行イベントの場合、currentline フィールドも設定されます。ar 内の他のフィールドの値を取得するには、フックは lua_getinfolua_getinfo() を参照)を呼び出す必要があります。return イベントの場合、event は通常の値である LUA_HOOKRET であるか、LUA_HOOKTAILRET である可能性があります。後者の場合、Lua は末尾呼び出しを行った関数からの戻りをシミュレートしています。この場合、lua_getinfo を呼び出すことは無意味です。
Lua がフックを実行している間は、他のフックの呼び出しを無効にします。したがって、フックが Lua を呼び戻して関数またはチャンクを実行する場合、この実行はフックの呼び出しなしで行われます。
lua_sethook lua_sethook()
int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
デバッグフック関数を設定します。
引数 f はフック関数です。mask は、フックが呼び出されるイベントを指定します。これは、定数 LUA_MASKCALL, LUA_MASKRET, LUA_MASKLINE, および LUA_MASKCOUNT のビット単位の or によって形成されます。count 引数は、マスクに LUA_MASKCOUNT が含まれている場合にのみ意味があります。各イベントについて、フックは以下のように呼び出されます。
コールフック: インタプリタが関数を呼び出すときに呼び出されます。フックは、Lua が新しい関数に入った直後、関数が引数を受け取る前に呼び出されます。
リターンフック: インタプリタが関数から戻るときに呼び出されます。フックは、Lua が関数を離れる直前に呼び出されます。関数によって返される値にアクセスすることはできません。
行フック: インタプリタが新しいコード行の実行を開始しようとしているとき、またはコード内で(同じ行にでも)ジャンプバックするときに呼び出されます。(このイベントは、Lua が Lua 関数を実行している間のみ発生します。)
カウントフック: インタプリタが count 命令を実行するたびに呼び出されます。(このイベントは、Lua が Lua 関数を実行している間のみ発生します。)
mask をゼロに設定すると、フックは無効になります。
lua_setlocal lua_setlocal()
const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);
指定されたアクティベーションレコードのローカル変数の値を設定します。パラメータ arn は、lua_getlocallua_getlocal() を参照)と同じです。lua_setlocal はスタックの最上位にある値を変数に割り当て、その名前を返します。また、スタックから値をポップします。
インデックスがアクティブなローカル変数の数を超える場合は、NULL を返します(何もポップしません)。
lua_setupvalue lua_setupvalue()
const char *lua_setupvalue (lua_State *L, int funcindex, int n);
クロージャのアップバリューの値を設定します。スタックの最上位にある値をアップバリューに割り当て、その名前を返します。また、スタックから値をポップします。パラメータ funcindexn は、lua_getupvaluelua_getupvalue() を参照)と同じです。
インデックスがアップバリューの数を超える場合は、NULL を返します(何もポップしません)。
lua-debugexample
例として、次の関数は、スタックの指定されたレベルにある関数のすべてのローカル変数とアップバリューの名前をリストします。
int listvars (lua_State *L, int level) {
  lua_Debug ar;
  int i;
  const char *name;
  if (lua_getstack(L, level, &ar) == 0)
    return 0;  /* failure: no such level in the stack */
  i = 1;
  while ((name = lua_getlocal(L, &ar, i++)) != NULL) {
    printf("local %d %s\n", i-1, name);
    lua_pop(L, 1);  /* remove variable value */
  }
  lua_getinfo(L, "f", &ar);  /* retrieves function */
  i = 1;
  while ((name = lua_getupvalue(L, -1, i++)) != NULL) {
    printf("upvalue %d %s\n", i-1, name);
    lua_pop(L, 1);  /* remove upvalue value */
  }
  return 1;
}

4 補助ライブラリ lua-aux

補助ライブラリは、C と Lua をインターフェースするための便利な関数をいくつか提供します。基本 API は C と Lua の間のすべてのインタラクションのためのプリミティブ関数を提供しますが、補助ライブラリはいくつかの一般的なタスクのための高レベルの関数を提供します。
補助ライブラリのすべての関数は、ヘッダーファイル lauxlib.h で定義されており、接頭辞 luaL_ が付いています。
補助ライブラリのすべての関数は基本 API の上に構築されているため、この API で実行できないことは何も提供しません。
補助ライブラリのいくつかの関数は、C 関数の引数をチェックするために使用されます。それらの名前は常に luaL_check* または luaL_opt* です。これらの関数はすべて、チェックが満たされない場合にエラーを発生させます。エラーメッセージは引数用にフォーマットされている(例: "bad argument #1")ため、これらの関数を他のスタック値に使用しないでください。

4.1 関数と型 lua-auxFunctions

ここでは、補助ライブラリのすべての関数と型をアルファベット順にリストします。
luaL_addchar luaL_addchar()
void luaL_addchar (luaL_Buffer *B, char c);
文字 c をバッファ B に追加します(luaL_Buffer を参照)。
luaL_addlstring luaL_addlstring()
void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
長さ ls が指す文字列をバッファ B に追加します(luaL_Buffer を参照)。文字列には埋め込まれたゼロが含まれる場合があります。
luaL_addsize luaL_addsize()
void luaL_addsize (luaL_Buffer *B, size_t n);
バッファ BluaL_Buffer を参照)に、以前にバッファ領域にコピーされた長さ n の文字列を追加します(luaL_prepbuffer() を参照)。
luaL_addstring luaL_addstring()
void luaL_addstring (luaL_Buffer *B, const char *s);
s が指すゼロ終端文字列をバッファ B に追加します(luaL_Buffer を参照)。文字列に埋め込まれたゼロを含めることはできません。
luaL_addvalue luaL_addvalue()
void luaL_addvalue (luaL_Buffer *B);
スタックの最上位にある値をバッファ B に追加します(luaL_Buffer を参照)。値をポップします。
これは、文字列バッファに対して、バッファに追加する値であるスタック上の追加要素とともに呼び出すことができる(および呼び出す必要がある)唯一の関数です。
luaL_argcheck luaL_argcheck()
void luaL_argcheck (lua_State *L,
                    int cond,
                    int narg,
                    const char *extramsg);
cond が true かどうかを確認します。そうでない場合は、次のメッセージでエラーを発生させます。ここで、func はコールスタックから取得されます。
bad argument #<narg> to <func> (<extramsg>)
luaL_argerror luaL_argerror()
int luaL_argerror (lua_State *L, int narg, const char *extramsg);
次のメッセージでエラーを発生させます。ここで、func はコールスタックから取得されます。
bad argument #<narg> to <func> (<extramsg>)
この関数は決して戻りませんが、C 関数で return luaL_argerror( args ) として使用するのが慣例です。
luaL_Buffer luaL_Buffer
typedef struct luaL_Buffer luaL_Buffer;
文字列バッファ の型です。
文字列バッファを使用すると、C コードで Lua 文字列を断片的に構築できます。その使用パターンは次のとおりです。
まず、luaL_Buffer 型の変数 b を宣言します。
次に、luaL_buffinit(L, &b) を呼び出して初期化します(luaL_buffinit() を参照)。
次に、luaL_add* 関数のいずれかを呼び出して、文字列の断片をバッファに追加します。
最後に、luaL_pushresult(&b) を呼び出して終了します(luaL_pushresult() を参照)。この呼び出しは、最終的な文字列をスタックの最上位に残します。
通常の操作中、文字列バッファは可変数のスタックスロットを使用します。そのため、バッファを使用している間は、スタックのトップがどこにあるかを想定することはできません。バッファ操作の連続する呼び出しの間で、スタックを使用できますが、その使用はバランスが取れている必要があります。つまり、バッファ操作を呼び出すとき、スタックは直前のバッファ操作の直後と同じレベルにある必要があります。(このルールの唯一の例外は、luaL_addvalue luaL_addvalue()です。)luaL_pushresultを呼び出した後、スタックはバッファが初期化されたときのレベルに戻り、その上に最終的な文字列が乗っています。
luaL_buffinit luaL_buffinit()
void luaL_buffinit (lua_State *L, luaL_Buffer *B);
バッファBを初期化します。この関数はスペースを割り当てません。バッファは変数として宣言する必要があります(luaL_Bufferを参照)。
luaL_callmeta luaL_callmeta()
int luaL_callmeta (lua_State *L, int obj, const char *e);
メタメソッドを呼び出します。
インデックスobjにあるオブジェクトがメタテーブルを持ち、このメタテーブルがフィールドeを持つ場合、この関数はこのフィールドを呼び出し、オブジェクトを唯一の引数として渡します。この場合、この関数は1を返し、呼び出しによって返された値をスタックにプッシュします。メタテーブルがない場合、またはメタメソッドがない場合、この関数は0を返します(スタックに値をプッシュせずに)。
luaL_checkany luaL_checkany()
void luaL_checkany (lua_State *L, int narg);
関数が位置nargに任意の型(nilを含む)の引数を持っているかどうかをチェックします。
luaL_checkint luaL_checkint()
int luaL_checkint (lua_State *L, int narg);
関数引数nargが数値であるかどうかをチェックし、この数値をintにキャストして返します。
luaL_checkinteger luaL_checkinteger()
lua_Integer luaL_checkinteger (lua_State *L, int narg);
関数引数nargが数値であるかどうかをチェックし、この数値をlua_Integerlua_Integerを参照)にキャストして返します。
luaL_checklong luaL_checklong()
long luaL_checklong (lua_State *L, int narg);
関数引数nargが数値であるかどうかをチェックし、この数値をlongにキャストして返します。
luaL_checklstring luaL_checklstring()
const char *luaL_checklstring (lua_State *L, int narg, size_t *l);
関数引数nargが文字列であるかどうかをチェックし、この文字列を返します。lNULLでない場合は、*lに文字列の長さを格納します。
luaL_checknumber luaL_checknumber()
lua_Number luaL_checknumber (lua_State *L, int narg);
関数引数nargが数値であるかどうかをチェックし、この数値を返します(lua_Numberを参照)。
luaL_checkoption luaL_checkoption()
int luaL_checkoption (lua_State *L,
                      int narg,
                      const char *def,
                      const char *const lst[]);
関数引数nargが文字列であるかどうかをチェックし、この文字列を配列lst(NULL終端である必要があります)で検索します。文字列が見つかった配列内のインデックスを返します。引数が文字列でない場合、または文字列が見つからない場合は、エラーを発生させます。
defNULLでない場合、関数は引数nargがない場合、またはこの引数がnilである場合、デフォルト値としてdefを使用します。
これは、文字列をC列挙型にマッピングするのに役立つ関数です。(Luaライブラリでの一般的な規則では、オプションを選択するために数値ではなく文字列を使用します。)
luaL_checkstack luaL_checkstack()
void luaL_checkstack (lua_State *L, int sz, const char *msg);
スタックサイズをtop + sz要素に拡張し、そのサイズまでスタックを拡張できない場合はエラーを発生させます。msgは、エラーメッセージに入れる追加のテキストです。
luaL_checkstring luaL_checkstring()
const char *luaL_checkstring (lua_State *L, int narg);
関数引数nargが文字列であるかどうかをチェックし、この文字列を返します。
luaL_checktype luaL_checktype()
void luaL_checktype (lua_State *L, int narg, int t);
関数引数nargが型tを持っているかどうかをチェックします(lua_type()を参照)。
luaL_checkudata luaL_checkudata()
void *luaL_checkudata (lua_State *L, int narg, const char *tname);
関数引数nargが型tnameのuserdataであるかどうかをチェックします(luaL_newmetatable()を参照)。
luaL_dofile luaL_dofile()
int luaL_dofile (lua_State *L, const char *filename);
指定されたファイルをロードして実行します。これは次のマクロとして定義されています
(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
エラーがない場合は0を返し、エラーが発生した場合は1を返します。
luaL_dostring luaL_dostring()
int luaL_dostring (lua_State *L, const char *str);
指定された文字列をロードして実行します。これは次のマクロとして定義されています
(luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
エラーがない場合は0を返し、エラーが発生した場合は1を返します。
luaL_error luaL_error()
int luaL_error (lua_State *L, const char *fmt, ...);
エラーを発生させます。エラーメッセージの形式は、fmtと、lua_pushfstringと同じルールに従う追加の引数によって与えられます(lua_pushfstring()を参照)。また、メッセージの先頭に、エラーが発生したファイル名と行番号を追加します(この情報が利用可能な場合)。
この関数は決して戻りませんが、C関数でreturn luaL_error( args )として使用するのが慣例です。
luaL_getmetafield luaL_getmetafield()
int luaL_getmetafield (lua_State *L, int obj, const char *e);
インデックスobjにあるオブジェクトのメタテーブルからフィールドeをスタックにプッシュします。オブジェクトがメタテーブルを持たない場合、またはメタテーブルにこのフィールドがない場合は、0を返し、何もプッシュしません。
luaL_getmetatable luaL_getmetatable()
void luaL_getmetatable (lua_State *L, const char *tname);
レジストリ内の名前tnameに関連付けられたメタテーブルをスタックにプッシュします(luaL_newmetatable()を参照)。
luaL_gsub luaL_gsub()
const char *luaL_gsub (lua_State *L,
                       const char *s,
                       const char *p,
                       const char *r);
文字列sのコピーを作成し、文字列pのすべての出現箇所を文字列rで置換します。結果の文字列をスタックにプッシュして返します。
luaL_loadbuffer luaL_loadbuffer()
int luaL_loadbuffer (lua_State *L,
                     const char *buff,
                     size_t sz,
                     const char *name);
バッファをLuaチャンクとしてロードします。この関数は、lua_loadlua_load()を参照)を使用して、サイズszbuffが指すバッファにチャンクをロードします。
この関数は、lua_loadと同じ結果を返します。nameはチャンク名であり、デバッグ情報およびエラーメッセージに使用されます。
luaL_loadfile luaL_loadfile()
int luaL_loadfile (lua_State *L, const char *filename);
ファイルをLuaチャンクとしてロードします。この関数は、lua_loadlua_load()を参照)を使用して、ファイル名filenameのファイル内のチャンクをロードします。filenameNULLの場合、標準入力からロードします。ファイル内の最初の行が#で始まる場合は無視されます。
この関数は、lua_loadと同じ結果を返しますが、ファイルを開いて読み取ることができない場合は、追加のエラーコードLUA_ERRFILEがあります。
lua_loadと同様に、この関数はチャンクをロードするだけで、実行はしません。
luaL_loadstring luaL_loadstring()
int luaL_loadstring (lua_State *L, const char *s);
文字列をLuaチャンクとしてロードします。この関数は、lua_loadlua_load()を参照)を使用して、NULL終端文字列sにチャンクをロードします。
この関数は、lua_loadと同じ結果を返します。
また、lua_loadと同様に、この関数はチャンクをロードするだけで、実行はしません。
luaL_newmetatable luaL_newmetatable()
int luaL_newmetatable (lua_State *L, const char *tname);
レジストリに既にキーtnameがある場合は、0を返します。それ以外の場合は、userdataのメタテーブルとして使用する新しいテーブルを作成し、キーtnameでレジストリに追加して、1を返します。
どちらの場合も、レジストリ内のtnameに関連付けられた最終値をスタックにプッシュします。
luaL_newstate luaL_newstate()
lua_State *luaL_newstate (void);
新しいLuaステートを作成します。標準Cのrealloc関数に基づいたアロケータを使用してlua_newstatelua_newstate()を参照)を呼び出し、致命的なエラーが発生した場合に標準エラー出力にエラーメッセージを出力するパニック関数(lua_atpanic()を参照)を設定します。
新しいステートを返します。メモリ割り当てエラーがある場合は、NULLを返します。
luaL_openlibs luaL_openlibs()
void luaL_openlibs (lua_State *L);
すべての標準Luaライブラリを指定されたステートに開きます。個々のライブラリを開く方法の詳細については、lua-openlibsも参照してください。
luaL_optint luaL_optint()
int luaL_optint (lua_State *L, int narg, int d);
関数引数nargが数値の場合、この数値をintにキャストして返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。
luaL_optinteger luaL_optinteger()
lua_Integer luaL_optinteger (lua_State *L,
                             int narg,
                             lua_Integer d);
関数引数nargが数値の場合、この数値をlua_Integerlua_Integerを参照)にキャストして返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。
luaL_optlong luaL_optlong()
long luaL_optlong (lua_State *L, int narg, long d);
関数引数nargが数値の場合、この数値をlongにキャストして返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。
luaL_optlstring luaL_optlstring()
const char *luaL_optlstring (lua_State *L,
                             int narg,
                             const char *d,
                             size_t *l);
関数引数nargが文字列の場合、この文字列を返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。
lNULLでない場合は、位置*lに結果の長さを格納します。
luaL_optnumber luaL_optnumber()
lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number d);
関数引数nargが数値の場合、この数値を返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。
luaL_optstring luaL_optstring()
const char *luaL_optstring (lua_State *L,
                            int narg,
                            const char *d);
関数引数nargが文字列の場合、この文字列を返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。
luaL_prepbuffer luaL_prepbuffer()
char *luaL_prepbuffer (luaL_Buffer *B);
バッファBluaL_Bufferを参照)に追加する文字列をコピーできる、サイズがLUAL_BUFFERSIZEの領域へのアドレスを返します。この領域に文字列をコピーした後、文字列を実際にバッファに追加するために、文字列のサイズを指定してluaL_addsizeluaL_addsize()を参照)を呼び出す必要があります。
luaL_pushresult luaL_pushresult()
void luaL_pushresult (luaL_Buffer *B);
バッファBの使用を終了し、最終的な文字列をスタックのトップに残します。
luaL_ref luaL_ref()
int luaL_ref (lua_State *L, int t);
スタックのトップにあるオブジェクトに対して、インデックスtのテーブル内にreferenceを作成して返します(そしてオブジェクトをポップします)。
参照は一意の整数キーです。テーブルtに整数キーを手動で追加しない限り、luaL_refは返すキーの一意性を保証します。参照rによって参照されるオブジェクトは、lua_rawgeti(L, t, r)lua_rawgeti()を参照)を呼び出すことで取得できます。関数luaL_unrefluaL_unref()を参照)は、参照とそれに関連付けられたオブジェクトを解放します。
スタックのトップにあるオブジェクトがnilの場合、luaL_refは定数LUA_REFNILを返します。定数LUA_NOREFは、luaL_refによって返されるどの参照とも異なることが保証されています。
luaL_Reg luaL_Reg
typedef struct luaL_Reg {
    const char *name;
    lua_CFunction func;
} luaL_Reg;
luaL_registerluaL_register()を参照)によって登録される関数の配列の型。nameは関数名で、funcは関数へのポインタです。luaL_Regの配列は、namefuncの両方がNULLである番兵エントリで終わる必要があります。
luaL_register luaL_register()
void luaL_register (lua_State *L,
                    const char *libname,
                    const luaL_Reg *l);
ライブラリを開きます。
libnameNULLに等しい状態で呼び出された場合、リストlluaL_Regを参照)内のすべての関数を、スタックのトップにあるテーブルに登録するだけです。
非NULLのlibnameで呼び出された場合、luaL_registerは新しいテーブルtを作成し、それをグローバル変数libnameの値として設定し、それをpackage.loaded[libname]の値として設定し、リストl内のすべての関数をそこに登録します。package.loaded[libname]または変数libnameにテーブルがある場合、新しいテーブルを作成する代わりに、このテーブルを再利用します。
いずれの場合も、関数はテーブルをスタックのトップに残します。
luaL_typename luaL_typename()
const char *luaL_typename (lua_State *L, int idx);
インデックスidxにある値の型名を返します。
luaL_typerror luaL_typerror()
int luaL_typerror (lua_State *L, int narg, const char *tname);
次のようなメッセージでエラーを生成します。
location : bad argument narg to 'func' ( tname expected, got rt )
ここで、locationluaL_whereluaL_where()を参照)によって生成され、funcは現在の関数の名前であり、rtは実際の引数の型名です。
luaL_unref luaL_unref()
void luaL_unref (lua_State *L, int t, int ref);
インデックスtのテーブルから参照refを解放します(luaL_ref()を参照)。エントリはテーブルから削除され、参照されているオブジェクトは収集できるようになります。参照refも解放され、再利用できるようになります。
refLUA_NOREFまたはLUA_REFNILの場合、luaL_unrefは何も行いません。
luaL_where luaL_where()
void luaL_where (lua_State *L, int lvl);
コールスタックのレベルlvlにおける現在のコントロールの位置を識別する文字列をスタックにプッシュします。通常、この文字列は次の形式になります。
chunkname:currentline
レベル0は実行中の関数、レベル1は実行中の関数を呼び出した関数などです。
この関数は、エラーメッセージのプレフィックスを作成するために使用されます。

5 標準ライブラリ lua-lib

標準ライブラリは、C API を介して直接実装される便利な関数を提供します。これらの関数のいくつかは、言語に不可欠なサービス(例えば、typegetmetatable)を提供します。他の関数は「外部」サービス(例えば、I/O)へのアクセスを提供します。また、他の関数は Lua 自体で実装できますが、非常に便利であるか、C での実装に値する重要なパフォーマンス要件があります(例えば、sort)。
すべてのライブラリは公式の C API を介して実装され、別々の C モジュールとして提供されます。現在、Lua には次の標準ライブラリがあります。
基本ライブラリ;
パッケージライブラリ;
文字列操作;
テーブル操作;
数学関数 (sin, log など);
入力と出力;
オペレーティングシステムの機能;
デバッグ機能。
基本ライブラリとパッケージライブラリを除き、各ライブラリは、すべての関数をグローバルテーブルのフィールドとして、またはそのオブジェクトのメソッドとして提供します。
lua-openlibs
これらのライブラリにアクセスするには、C ホストプログラムは、すべての標準ライブラリを開くluaL_openlibs関数(luaL_openlibs()を参照)を呼び出す必要があります。または、ホストプログラムは、luaopen_base(基本ライブラリ用)、luaopen_package(パッケージライブラリ用)、luaopen_string(文字列ライブラリ用)、luaopen_table(テーブルライブラリ用)、luaopen_math(数学ライブラリ用)、luaopen_io(I/O およびオペレーティングシステムライブラリ用)、およびluaopen_debug(デバッグライブラリ用)を呼び出すことで、ライブラリを個別に開くことができます。これらの関数はlualib.hで宣言されており、直接呼び出すべきではありません。他の Lua C 関数と同様に、たとえばlua_calllua_call()を参照)を使用して呼び出す必要があります。

5.1 基本関数 lua-lib-core

基本ライブラリは、Lua にいくつかのコア関数を提供します。このライブラリをアプリケーションに含めない場合は、その機能の一部に実装を提供する必要があるかどうかを慎重に確認する必要があります。
assert({v} [, {message}]) assert()
引数vの値がfalse(つまり、nilまたはfalse)の場合にエラーを発行します。それ以外の場合は、すべての引数を返します。messageはエラーメッセージです。省略すると、デフォルトで「assertion failed!」になります。
collectgarbage({opt} [, {arg}]) collectgarbage()
この関数は、ガベージコレクタへの汎用インターフェイスです。最初の引数{opt}に応じて、さまざまな機能を実行します。
"stop"はガベージコレクタを停止します。"restart"はガベージコレクタを再起動します。"collect"は完全なガベージコレクションサイクルを実行します。"count"は Lua によって使用されている合計メモリを(Kバイト単位で)返します。"step"はガベージコレクションステップを実行します。ステップの「サイズ」は、{arg}によって(大きい値はより多くのステップを意味する)特定されない方法で制御されます。ステップサイズを制御したい場合は、{arg}の値を実験的に調整する必要があります。ステップがコレクションサイクルを終了した場合は、trueを返します。"setpause"は、コレクタのpauseの新しい値として{arg} / 100を設定します(lua-gcを参照)。"setstepmul"は、コレクタのステップ乗数の新しい値として{arg} / 100を設定します(lua-gcを参照)。
dofile({filename}) dofile()
指定されたファイルを開き、その内容を Lua チャンクとして実行します。引数なしで呼び出された場合、dofileは標準入力(stdin)の内容を実行します。チャンクによって返されたすべての値を返します。エラーが発生した場合、dofileはその呼び出し元にエラーを伝播します(つまり、dofileは保護モードで実行されません)。
error({message} [, {level}]) error()
最後に呼び出された保護関数を終了し、エラーメッセージとしてmessageを返します。関数{error}は決して返しません。
通常、{error}はメッセージの先頭にエラー位置に関する情報をいくつか追加します。引数{level}は、エラー位置を取得する方法を指定します。レベル1(デフォルト)の場合、エラー位置は{error}関数が呼び出された場所です。レベル2は、{error}を呼び出した関数が呼び出された場所を指します。などです。レベル0を渡すと、メッセージへのエラー位置情報の追加を回避できます。
_G _G
グローバル環境(つまり、_G._G = _G)を保持するグローバル変数(関数ではありません)。Lua自体はこの変数を使用しません。その値を変更しても、どの環境にも影響しませんし、その逆も同様です。(環境を変更するにはsetfenvを使用します。)
getfenv({f}) getfenv()
関数で使用されている現在の環境を返します。{f}は、Lua 関数、またはそのスタックレベルの関数を指定する数値にすることができます。レベル1は、getfenvを呼び出す関数です。指定された関数が Lua 関数でない場合、または{f}が0の場合、getfenvはグローバル環境を返します。{f}のデフォルトは1です。
getmetatable({object}) getmetatable()
{object}にメタテーブルがない場合は、nilを返します。それ以外の場合は、オブジェクトのメタテーブルに"__metatable"フィールドがある場合、関連付けられた値を返します。それ以外の場合は、指定されたオブジェクトのメタテーブルを返します。
ipairs({t}) ipairs()
3つの値(イテレータ関数、テーブル{t}、および0)を返すため、次の構成
for i,v in ipairs(t) do body end
は、テーブルに存在しない最初の整数キーまで、ペア(1,t[1])、(2,t[2])、... を反復処理します。
load({func} [, {chunkname}]) load()
チャンクをロードします。チャンクの各部分を取得するために関数{func}を使用します。{func}への各呼び出しは、前の結果と連結される文字列を返す必要があります。nil(または値がない場合)を返すと、チャンクの終わりを示します。
エラーがない場合は、コンパイルされたチャンクを関数として返します。それ以外の場合は、nilとエラーメッセージを返します。返される関数の環境は、グローバル環境です。
{chunkname}は、エラーメッセージとデバッグ情報のためのチャンク名として使用されます。
loadfile([{filename}]) loadfile()
loadload()を参照)と同様ですが、チャンクをファイル{filename}から取得します。ファイル名が指定されていない場合は、標準入力から取得します。
loadstring({string} [, {chunkname}]) loadstring()
loadload()を参照)と同様ですが、チャンクを特定の{string}から取得します。
特定の文字列をロードして実行するには、次のイディオムを使用します。
assert(loadstring(s))()
next({table} [, {index}]) next()
プログラムがテーブルのすべてのフィールドを走査できるようにします。最初の引数はテーブルで、2番目の引数はそのテーブルのインデックスです。nextは、テーブルの次のインデックスとそれに関連付けられた値を返します。2番目の引数としてnilを指定して呼び出すと、nextは最初のインデックスとそれに関連付けられた値を返します。最後のインデックス、または空のテーブルでnilを指定して呼び出すと、nextnilを返します。2番目の引数がない場合は、nilとして解釈されます。特に、テーブルが空かどうかを確認するためにnext(t)を使用できます。
インデックスが列挙される順序は、数値インデックスであっても指定されていません。(テーブルを数値順に走査するには、数値forまたはipairs()関数を使用してください。)
走査中に、テーブルに存在しないフィールドに値を割り当てた場合、nextの動作は未定義です。ただし、既存のフィールドは変更できます。特に、既存のフィールドをクリアできます。
pairs({t}) pairs()
3つの値を返します。 next()関数、テーブル{t}、およびnilです。これにより、次の構成になります。
for k,v in pairs(t) do body end
テーブル{t}のすべてのキーと値のペアを反復処理します。
pcall({f}, {arg1}, {...}) pcall()
指定された引数を使用して、関数{f}保護モードで呼び出します。これは、{f}内部のエラーが伝播されないことを意味します。代わりに、pcallはエラーをキャッチし、ステータスコードを返します。最初の結果はステータスコード(ブール値)であり、呼び出しがエラーなしで成功した場合はtrueになります。その場合、pcallは、この最初の結果の後に、呼び出しからのすべての結果も返します。エラーが発生した場合、pcallfalseとエラーメッセージを返します。
print({...}) print()
任意の数の引数を受け取り、それらの値をstdoutに出力します。その際、tostringtostring()関数を使用して文字列に変換します。printは、フォーマットされた出力用ではなく、値をすばやく表示するためのものです(通常はデバッグ用)。フォーマットされた出力の場合は、string.formatstring.format()を参照)を使用してください。
rawequal({v1}, {v2}) rawequal()
メタメソッドを呼び出さずに、{v1}{v2}と等しいかどうかを確認します。ブール値を返します。
rawget({table}, {index}) rawget()
メタメソッドを呼び出さずに、table[index]の実際の値を取得します。{table}はテーブルである必要があります。{index}は任意の値にできます。
rawset({table}, {index}, {value}) rawset()
メタメソッドを呼び出さずに、table[index]の実際の値を{value}に設定します。{table}はテーブルである必要があり、{index}nil以外の任意の値、{value}は任意のLua値である必要があります。
この関数は{table}を返します。
select({index}, {...}) select()
{index}が数値の場合、引数番号{index}より後のすべての引数を返します。それ以外の場合、{index}は文字列"#"である必要があり、selectは受け取った追加の引数の合計数を返します。
setfenv({f}, {table}) setfenv()
指定された関数で使用する環境を設定します。{f}は、Lua関数、またはそのスタックレベルで関数を指定する数値にすることができます。レベル1は、setfenvを呼び出す関数です。setfenvは、指定された関数を返します。
特別なケースとして、{f}が0の場合、setfenvは実行中のスレッドの環境を変更します。この場合、setfenvは値を返しません。
setmetatable({table}, {metatable}) setmetatable()
指定されたテーブルのメタテーブルを設定します。(Luaから、Cからのみ、他の型のメタテーブルを変更することはできません。){metatable}nilの場合、指定されたテーブルのメタテーブルを削除します。元のメタテーブルに"__metatable"フィールドがある場合は、エラーが発生します。
この関数は{table}を返します。
tonumber({e} [, {base}]) tonumber()
引数を数値に変換しようとします。引数が既に数値であるか、数値に変換可能な文字列である場合、tonumberはこの数値を返します。それ以外の場合は、nilを返します。
オプションの引数は、数値を解釈するための基数を指定します。基数は、2から36までの任意の整数にできます。10を超える基数では、文字A(大文字または小文字)は10、Bは11、以下同様に、Zは35を表します。基数10(デフォルト)では、数値は10進数部分と、オプションの指数部分を持つことができます(lua-lexicalを参照)。他の基数では、符号なし整数のみが受け入れられます。
tostring({e}) tostring()
任意の型の引数を受け取り、適切な形式の文字列に変換します。数値の変換方法を完全に制御するには、string.formatstring.format()を参照)を使用してください。
__tostring
{e}のメタテーブルに"__tostring"フィールドがある場合、tostringは対応する値を{e}を引数として呼び出し、呼び出しの結果をその結果として使用します。
type({v}) lua-type()
唯一の引数の型を、文字列としてコード化して返します。この関数の可能な結果は、"nil"(値nilではなく文字列)、"number""string""boolean"table""function""thread"、および"userdata"です。
unpack({list} [, {i} [, {j}]]) unpack()
指定されたテーブルから要素を返します。この関数は以下と同等です。
return list[i], list[i+1], ..., list[j]
上記のコードは、固定数の要素に対してのみ記述できることを除きます。デフォルトでは、{i}は1で、{j}は長さ演算子で定義されたリストの長さです(lua-lengthを参照)。
_VERSION _VERSION
現在のインタープリターバージョンを含む文字列を保持するグローバル変数(関数ではありません)。この文字列の現在の内容は"Lua 5.1"です。
xpcall({f}, {err}) xpcall()
この関数は、新しいエラーハンドラーを設定できることを除いて、pcallpcall()を参照)に似ています。
xpcallは、{err}をエラーハンドラーとして使用して、保護モードで関数{f}を呼び出します。{f}内のエラーは伝播されません。代わりに、xpcallはエラーをキャッチし、元のエラーオブジェクトで{err}関数を呼び出し、ステータスコードを返します。最初の結果はステータスコード(ブール値)であり、呼び出しがエラーなしで成功した場合はtrueになります。この場合、xpcallは、この最初の結果の後に、呼び出しからのすべての結果も返します。エラーが発生した場合、xpcallfalse{err}からの結果を返します。

5.2 コルーチン操作 lua-lib-coroutine

コルーチンに関連する操作は、基本ライブラリのサブライブラリを構成し、coroutineテーブル内にあります。コルーチンの一般的な説明については、lua-coroutineを参照してください。
coroutine.create({f}) coroutine.create()
本体に{f}を持つ新しいコルーチンを作成します。{f}はLua関数である必要があります。この新しいコルーチン、型"thread"のオブジェクトを返します。
coroutine.resume({co} [, {val1}, {...}]) coroutine.resume()
コルーチン{co}の実行を開始または継続します。コルーチンを初めて再開すると、本体の実行が開始されます。値{val1}{...}は、本体関数への引数として渡されます。コルーチンが中断されている場合、resumeはコルーチンを再開します。値{val1}{...}は、yieldからの結果として渡されます。
コルーチンがエラーなしで実行される場合、resumeは、yieldに渡された値(コルーチンがyieldする場合)または本体関数によって返された値(コルーチンが終了する場合)に加えて、trueを返します。エラーがある場合、resumefalseとエラーメッセージを返します。
coroutine.running() coroutine.running()
実行中のコルーチンを返します。メインスレッドによって呼び出された場合はnilを返します。
coroutine.status({co}) coroutine.status()
コルーチン{co}の状態を文字列として返します。コルーチンが実行中の場合(つまり、statusを呼び出した場合)は"running"、コルーチンがyieldの呼び出しで中断されている場合、またはまだ実行が開始されていない場合は"suspended"、コルーチンがアクティブであるが実行中でない場合(つまり、別のコルーチンを再開した場合)は"normal"、コルーチンが本体関数を完了した場合、またはエラーで停止した場合は"dead"を返します。
coroutine.wrap({f}) coroutine.wrap()
本体に{f}を持つ新しいコルーチンを作成します。{f}はLua関数である必要があります。呼び出されるたびにコルーチンを再開する関数を返します。関数に渡された引数はすべて、resumeへの追加の引数として動作します。最初のブール値を除いて、resumeによって返される同じ値を返します。エラーの場合、エラーを伝播します。
coroutine.yield({...}) coroutine.yield()
呼び出し元のコルーチンの実行を中断します。コルーチンは、C関数、メタメソッド、またはイテレーターを実行することはできません。yieldへの引数はすべて、resumeへの追加の結果として渡されます。

5.3 モジュール lua-modules

packageライブラリは、Luaでモジュールをロードおよび構築するための基本的な機能を提供します。グローバル環境でその関数のうち2つを直接エクスポートします。requiremoduleです(require()module()を参照)。その他はすべてpackageテーブルでエクスポートされます。
module({name} [, {...}]) module()
モジュールを作成します。package.loaded[name] にテーブルがある場合、このテーブルがモジュールになります。それ以外の場合で、指定された名前のグローバルテーブル t がある場合、このテーブルがモジュールになります。それ以外の場合は、新しいテーブル t を作成し、グローバル変数 {name}package.loaded[name] の値として設定します。この関数は、t._NAME を指定された名前、t._M をモジュール (t 自身)、t._PACKAGE をパッケージ名 (モジュール名の最後の構成要素を除いたもの。下記参照) で初期化します。最後に、module は現在の関数の新しい環境として t を設定し、package.loaded[name] の新しい値として設定するため、require()t を返します。
{name} が複合名 (つまり、ドットで区切られた構成要素を持つ名前) である場合、module は各構成要素のテーブルを作成 (または、既に存在する場合は再利用) します。たとえば、{name}a.b.c の場合、module はモジュールテーブルをグローバル変数 a のフィールド b のフィールド c に格納します。
この関数は、モジュール名の後にオプションの options を受け取ることができます。各オプションは、モジュールに適用される関数です。
require({modname}) require()
指定されたモジュールをロードします。この関数は、まず package.loaded テーブルを調べて、{modname} が既にロードされているかどうかを判断します。ロードされている場合は、requirepackage.loaded[modname] に格納されている値を返します。それ以外の場合は、モジュールの loader を見つけようとします。
ローダーを見つけるために、まず requirepackage.preload[modname] を照会します。値がある場合、この値 (関数である必要があります) がローダーになります。それ以外の場合、requirepackage.path に格納されているパスを使用して Lua ローダーを検索します。それでも失敗する場合は、package.cpath に格納されているパスを使用して C ローダーを検索します。それでも失敗する場合は、all-in-one ローダーを試します (下記参照)。
C ライブラリをロードする場合、require は最初にダイナミックリンク機能を使用して、アプリケーションをライブラリにリンクします。次に、このライブラリ内でローダーとして使用する C 関数を見つけようとします。この C 関数の名前は、文字列 "luaopen_" に、各ドットがアンダースコアに置き換えられたモジュール名のコピーを連結したものです。さらに、モジュール名にハイフンがある場合、最初のハイフンまでの (ハイフンを含む) 接頭辞は削除されます。たとえば、モジュール名が a.v1-b.c の場合、関数名は luaopen_b_c になります。
require がモジュールの Lua ライブラリも C ライブラリも見つけられない場合、all-in-one loader を呼び出します。このローダーは、指定されたモジュールのルート名のライブラリの C パスを検索します。たとえば、a.b.c を require する場合、a の C ライブラリを検索します。見つかった場合は、サブモジュールのオープン関数を探します。この例では、luaopen_a_b_c になります。この機能により、パッケージは複数の C サブモジュールを 1 つのライブラリにパックでき、各サブモジュールは元のオープン関数を保持します。
ローダーが見つかると、require は単一の引数 {modname} を渡してローダーを呼び出します。ローダーが値を返す場合、require は返された値を package.loaded[modname] に割り当てます。ローダーが値を返さず、package.loaded[modname] に値を割り当てていない場合、require はこのエントリに true を割り当てます。いずれの場合も、requirepackage.loaded[modname] の最終的な値を返します。
モジュールのロードまたは実行中にエラーが発生した場合、またはモジュールのローダーが見つからない場合は、require はエラーを通知します。
package.cpath package.cpath
C ローダーを検索するために require が使用するパス。
Lua は、環境変数 LUA_CPATH (および luaconf.h で定義された別のデフォルトパス) を使用して、Lua パス package.path を初期化するのと同じ方法で、C パス package.cpath を初期化します。
package.loaded package.loaded()
どのモジュールが既にロードされているかを制御するために require が使用するテーブル。モジュール modname を require するときに、package.loaded[modname] が false でない場合、require はそこに格納されている値を単純に返します。
package.loadlib({libname}, {funcname}) package.loadlib()
ホストプログラムを C ライブラリ {libname} と動的にリンクします。このライブラリ内で、関数 {funcname} を検索し、この関数を C 関数として返します。(したがって、{funcname} はプロトコル ( lua_CFunction を参照) に従う必要があります)。
これは低レベルの関数です。パッケージおよびモジュールシステムを完全にバイパスします。require とは異なり、パス検索は実行せず、拡張機能は自動的に追加しません。{libname} は、必要に応じてパスと拡張子を含む、C ライブラリの完全なファイル名である必要があります。{funcname} は、C ライブラリによってエクスポートされた正確な名前である必要があります (使用される C コンパイラとリンカーによって異なる場合があります)。
この関数は ANSI C でサポートされていません。そのため、一部のプラットフォーム (Windows、Linux、Mac OS X、Solaris、BSD、および dlfcn 標準をサポートするその他の Unix システム) でのみ利用可能です。
package.path package.path
Lua ローダーを検索するために require が使用するパス。
起動時に、Lua は環境変数 LUA_PATH の値、または環境変数が定義されていない場合は luaconf.h で定義されたデフォルトパスでこの変数を初期化します。環境変数の値に含まれる ";;" は、デフォルトパスに置き換えられます。
パスは、セミコロンで区切られた テンプレート のシーケンスです。各テンプレートに対して、require はテンプレート内の各疑問符を filename に変更します。filename は、各ドットが「ディレクトリ区切り文字」(Unix の "/" など) に置き換えられた modname です。次に、結果のファイル名のロードを試みます。したがって、たとえば、Lua パスが
"./?.lua;./?.lc;/usr/local/?/init.lua"
モジュール foo の Lua ローダーの検索では、ファイル ./foo.lua./foo.lc、および /usr/local/foo/init.lua をこの順序でロードしようとします。
package.preload package.preload()
特定のモジュールのローダーを格納するテーブル ( require() を参照)。
package.seeall({module}) package.seeall()
グローバル環境から値を継承するように、グローバル環境を参照する __index フィールドを使用して {module} のメタテーブルを設定します。関数 {module} のオプションとして使用します。

5.4 文字列操作 lua-lib-string

このライブラリは、部分文字列の検索と抽出、パターンマッチングなど、文字列操作用の汎用関数を提供します。Lua で文字列をインデックスするとき、最初の文字は位置 1 にあります (C のように 0 ではありません)。インデックスには負の値を指定でき、文字列の末尾から逆方向にインデックスとして解釈されます。したがって、最後の文字は位置 -1 にあり、以降も同様です。
文字列ライブラリは、すべての関数をテーブル string 内に提供します。また、__index フィールドが string テーブルを指す文字列のメタテーブルを設定します。したがって、オブジェクト指向スタイルで文字列関数を使用できます。たとえば、string.byte(s, i)s:byte(i) と記述できます。
string.byte({s} [, {i} [, {j}]]) string.byte()
文字 s[i]s[i+1]、...、s[j] の内部数値コードを返します。{i} のデフォルト値は 1 です。{j} のデフォルト値は {i} です。
数値コードはプラットフォーム間で必ずしも移植可能ではないことに注意してください。
string.char({...}) string.char()
0 個以上の整数を受け取ります。各文字が対応する引数に等しい内部数値コードを持つ、引数の数に等しい長さの文字列を返します。
数値コードはプラットフォーム間で必ずしも移植可能ではないことに注意してください。
string.dump({function}) string.dump()
指定された関数のバイナリ表現を含む文字列を返します。この文字列に対する後続の loadstring() は、関数のコピーを返します。{function} はアップバリューのない Lua 関数である必要があります。
string.find({s}, {pattern} [, {init} [, {plain}]]) string.find()
文字列 {s} 内の {pattern} の最初のマッチを検索します。一致が見つかった場合、{find} はこの出現箇所が開始および終了する {s} のインデックスを返します。それ以外の場合は、nil を返します。3 番目のオプションの数値引数 {init} は、検索を開始する場所を指定します。そのデフォルト値は 1 で、負の値になる可能性があります。4 番目のオプションの引数 {plain} として {true} の値を指定すると、パターンマッチング機能が無効になり、関数は単純な「部分文字列検索」操作を実行します。{pattern} 内の文字は「マジック」と見なされません。{plain} が指定されている場合は、{init} も指定する必要があることに注意してください。
パターンにキャプチャがある場合、一致が成功すると、キャプチャされた値も 2 つのインデックスの後に返されます。
string.format({formatstring}, {...}) string.format()
最初の引数 (文字列である必要があります) に指定された説明に従って、可変数の引数の書式設定されたバージョンを返します。書式文字列は、標準 C 関数の printf ファミリと同じルールに従います。唯一の違いは、オプション/修飾子 *lLnp、および h がサポートされておらず、追加のオプション q があることです。q オプションは、Lua インタープリタによって安全に読み戻せる形式で文字列をフォーマットします。文字列は二重引用符で囲んで記述され、文字列内のすべての二重引用符、改行、埋め込まれたゼロ、およびバックスラッシュは、書き込まれるときに正しくエスケープされます。たとえば、呼び出し
string.format('%q', 'a string with "quotes" and \n new line')
文字列を生成します
"a string with \"quotes\" and \
 new line"
オプション cdEefgGiouX、および x はすべて引数として数値を予期しますが、qs は文字列を予期します。
この関数は、埋め込まれたゼロを含む文字列値を受け入れません。
string.gmatch({s}, {pattern}) string.gmatch()
呼び出されるたびに、文字列 {s} 上の {pattern} から次のキャプチャを返す イテレータ関数を返します。
{pattern} がキャプチャを指定しない場合、一致全体が各呼び出しで生成されます。
例として、次のループ
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
  print(w)
end
文字列 {s} からすべての単語を反復処理し、1 行に 1 つずつ印刷します。次の例では、指定された文字列からすべてのペア key=value をテーブルに収集します
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
  t[k] = v
end
string.gsub({s}, {pattern}, {repl} [, {n}]) string.gsub()
{s} のコピーを返します。コピー内では、{pattern} のすべての出現箇所が {repl} で指定された置換文字列に置き換えられています。{repl} は文字列、テーブル、または関数のいずれかです。gsub はまた、2 番目の値として、実行された置換の総数を返します。
{repl} が文字列の場合、その値が置換に使用されます。文字 % はエスケープ文字として機能します。{repl} 内の %n の形式のシーケンス ({n} は 1 から 9 の間) は、{n} 番目のキャプチャされた部分文字列の値を示します(下記参照)。シーケンス %0 は一致全体を示します。シーケンス %% は単一の % を示します。
{repl} がテーブルの場合、テーブルは一致ごとにクエリされ、最初のキャプチャがキーとして使用されます。パターンがキャプチャを指定しない場合、一致全体がキーとして使用されます。
{repl} が関数の場合、この関数は一致が発生するたびに呼び出され、キャプチャされたすべての部分文字列が順番に引数として渡されます。パターンがキャプチャを指定しない場合、一致全体が単一の引数として渡されます。
テーブルクエリまたは関数呼び出しによって返された値が文字列または数値の場合、それが置換文字列として使用されます。それ以外の場合、false または nil の場合は置換は行われません(つまり、元の照合が文字列に保持されます)。
オプションの最後のパラメータ {n} は、発生する置換の最大数を制限します。たとえば、{n} が 1 の場合、pattern の最初の出現箇所のみが置き換えられます。
いくつかの例を以下に示します。
x = string.gsub("hello world", "(%w+)", "%1 %1")
--> x="hello hello world world"
x = string.gsub("hello world", "%w+", "%0 %0", 1)
--> x="hello hello world"
x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
--> x="world hello Lua from"
x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
--> x="home = /home/roberto, user = roberto"
x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
      return loadstring(s)()
    end)
--> x="4+5 = 9"
local t = {name="lua", version="5.1"}
x = string.gsub("$name%-$version.tar.gz", "%$(%w+)", t)
--> x="lua-5.1.tar.gz"
string.len({s}) string.len()
文字列を受け取り、その長さを返します。空文字列 "" の長さは 0 です。埋め込まれたゼロもカウントされるため、"a\000b\000c" の長さは 5 です。
string.lower({s}) string.lower()
文字列を受け取り、この文字列のすべての英大文字が英小文字に変更されたコピーを返します。その他の文字はすべて変更されずに残ります。英大文字の定義は現在のロケールによって異なります。
string.match({s}, {pattern} [, {init}]) string.match()
文字列 {s} 内で最初に {pattern} に一致するものを探します。一致するものが見つかった場合、match はパターンからのキャプチャを返します。それ以外の場合は nil を返します。{pattern} がキャプチャを指定しない場合、一致全体が返されます。3番目のオプションの数値引数 {init} は、検索を開始する場所を指定します。デフォルト値は 1 で、負の値でも構いません。
string.rep({s}, {n}) string.rep()
文字列 {s}{n} 個のコピーの連結である文字列を返します。
string.reverse({s}) string.reverse()
文字列 {s} を反転させた文字列を返します。
string.sub({s}, {i} [, {j}]) string.sub()
{i} で始まり {j} まで続く {s} の部分文字列を返します。{i}{j} は負の値でも構いません。{j} がない場合は、-1(文字列の長さと同じ)とみなされます。特に、string.sub(s,1,j) の呼び出しは、長さが {j}{s} の接頭辞を返し、string.sub(s,-i) は長さが {i}{s} の接尾辞を返します。
string.upper({s}) string.upper()
文字列を受け取り、その文字列のすべての英小文字が英大文字に変更されたコピーを返します。その他の文字はすべて変更されずに残ります。英小文字の定義は、現在のロケールによって異なります。

5.4.1 パターン lua-patterns

文字クラスは、文字の集合を表すために使用されます。文字クラスの記述では、以下の組み合わせが許可されています。
x (x はマジック文字 ^$()%.[]*+-? のいずれでもない) は、文字 x 自体を表します。
. (ドット) はすべての文字を表します。
%a はすべての文字を表します。
%c はすべての制御文字を表します。
%d はすべての数字を表します。
%l はすべての英小文字を表します。
%p はすべての句読文字を表します。
%s はすべての空白文字を表します。
%u はすべての英大文字を表します。
%w はすべての英数字を表します。
%x はすべての16進数値を表します。
%z は表現が 0 の文字を表します。
%x (x は英数字以外の任意の文字) は文字 x を表します。これはマジック文字をエスケープする標準的な方法です。句読文字(マジックでないものでも)は、パターン内でそれ自身を表すために使用する場合、% を前に付けることができます。
[set] は、set 内のすべての文字の和であるクラスを表します。文字の範囲は、範囲の終端文字を - で区切ることで指定できます。上記のすべてのクラス %x は、set のコンポーネントとしても使用できます。set 内の他のすべての文字はそれ自体を表します。たとえば、[%w_] (または [_%w]) はすべての英数字とアンダースコアを表し、[0-7] は8進数値を表し、[0-7%l%-] は8進数値に加えて英小文字と - 文字を表します。
範囲とクラスの間の相互作用は定義されていません。したがって、[%a-z][a-%%] のようなパターンには意味がありません。
[^set] は、set の補完を表します。ここで、set は上記のように解釈されます。
単一の文字(%a%c など)で表されるすべてのクラスに対して、対応する大文字はそのクラスの補完を表します。たとえば、%S はすべての空白文字以外の文字を表します。
文字、空白、およびその他の文字グループの定義は、現在のロケールによって異なります。特に、クラス [a-z]%l と同等ではない場合があります。

パターンアイテム lua-patternitem

パターンアイテムは次のいずれかになります。
単一の文字クラス。これは、クラス内の任意の単一文字に一致します。
* が続く単一の文字クラス。これは、クラス内の文字の 0 回以上の繰り返しに一致します。これらの繰り返し項目は、常に可能な限り最長のシーケンスに一致します。
+ が続く単一の文字クラス。これは、クラス内の文字の 1 回以上の繰り返しに一致します。これらの繰り返し項目は、常に可能な限り最長のシーケンスに一致します。
- が続く単一の文字クラス。これは、クラス内の文字の 0 回以上の繰り返しにも一致します。* とは異なり、これらの繰り返し項目は常に可能な限り最短のシーケンスに一致します。
? が続く単一の文字クラス。これは、クラス内の文字の 0 回または 1 回の出現に一致します。
%n (n は 1 から 9 の間)。このような項目は、n 番目にキャプチャされた文字列と同じ部分文字列に一致します(下記参照)。
%bxy。ここで、xy は 2 つの異なる文字です。このような項目は、x で始まり、y で終わり、xy がバランスが取れている文字列に一致します。これは、文字列を左から右に読み、x に対して +1 をカウントし、y に対して -1 をカウントすると、終端の y はカウントが 0 に達する最初の y であることを意味します。たとえば、項目 %b() は、括弧がバランスが取れた式に一致します。

パターン lua-pattern

パターンは、パターンアイテムのシーケンスです。パターンの先頭にある ^ は、一致を対象文字列の先頭に固定します。パターンの末尾にある $ は、一致を対象文字列の末尾に固定します。その他の位置では、^$ は特別な意味を持たず、それ自体を表します。

キャプチャ lua-capture

パターンには、括弧で囲まれたサブパターンを含めることができます。それらはキャプチャを記述します。一致が成功すると、キャプチャに一致する対象文字列の部分文字列が、後で使用するために格納 (キャプチャ) されます。キャプチャは、左括弧に従って番号が付けられます。たとえば、パターン "(a*(.)%w(%s*))" では、"a*(.)%w(%s*)" に一致する文字列の部分は最初のキャプチャとして格納され(したがって、番号1になります)、. に一致する文字は番号 2 でキャプチャされ、%s* に一致する部分は番号 3 を持ちます。
特別なケースとして、空のキャプチャ () は、現在の文字列位置(数値)をキャプチャします。たとえば、文字列 "flaaap" にパターン "()aa()" を適用すると、2 つのキャプチャ(3 と 5)が発生します。
パターンに埋め込まれたゼロを含めることはできません。代わりに %z を使用してください。

5.5 テーブル操作 lua-lib-table

このライブラリは、テーブル操作のための汎用的な関数を提供します。これは、テーブル table 内にすべての関数を提供します。
tableライブラリのほとんどの関数は、テーブルが配列またはリストを表すと想定しています。これらの関数では、テーブルの「長さ」について話すとき、長さ演算子の結果を意味します。
table.concat({table} [, {sep} [, {i} [, {j}]]]) table.concat()
すべての要素が文字列または数値である配列を指定すると、table[i]..sep..table[i+1] ... sep..table[j] を返します。{sep} のデフォルト値は空の文字列、{i} のデフォルトは 1、{j} のデフォルトはテーブルの長さです。{i}{j} より大きい場合は、空の文字列を返します。
table.foreach({table}, {f}) table.foreach()
指定された {f}{table} のすべての要素に対して実行します。要素ごとに、{f} は引数としてインデックスとそれぞれの値とともに呼び出されます。{f} が `nil` でない値を返した場合、ループが中断され、この値が table.foreach の最終値として返されます。
テーブルトラバーサルに関する追加情報については、next() を参照してください。
table.foreachi({table}, {f}) table.foreachi()
{table} の数値インデックスに対して、与えられた関数 {f} を実行します。各インデックスに対して、{f} はインデックスと対応する値を引数として呼び出されます。インデックスは、1 からテーブルの長さ `n` まで順番にアクセスされます。{f} が `nil` 以外の値を返した場合、ループは中断され、その値が `table.foreachi` の結果として返されます。
table.insert({table}, [{pos},] {value}) table.insert()
{table}{pos} の位置に要素 {value} を挿入し、必要に応じて他の要素を上にシフトしてスペースを作ります。{pos} のデフォルト値は `n+1` です。ここで `n` はテーブルの長さ(lua-length を参照)です。したがって、`table.insert(t,x)` の呼び出しは、テーブル `t` の最後に `x` を挿入します。
table.maxn({table}) table.maxn()
与えられたテーブルの最大の正の数値インデックスを返します。テーブルに正の数値インデックスがない場合はゼロを返します。(この関数は、テーブル全体を線形に走査することで機能します。)
table.remove({table} [, {pos}]) table.remove()
{table} から {pos} の位置にある要素を削除し、必要に応じて他の要素を下にシフトしてスペースを閉じます。削除された要素の値を返します。{pos} のデフォルト値は `n` です。ここで `n` はテーブルの長さ(lua-length を参照)です。したがって、`table.remove(t)` の呼び出しは、テーブル `t` の最後の要素を削除します。
table.sort({table} [, {comp}]) table.sort()
テーブルの要素を、所定の順序で、table[1] から table[n] まで、インプレースでソートします。ここで `n` はテーブルの長さ(lua-length を参照)です。{comp} が与えられた場合、それは2つのテーブル要素を受け取り、最初の要素が2番目の要素より小さい場合にtrueを返す関数である必要があります(したがって、ソート後、`not comp(a[i+1],a[i])` はtrueになります)。{comp} が与えられない場合、標準の Lua 演算子 `<` が代わりに使用されます。
ソートアルゴリズムは安定`ではありません`。つまり、指定された順序で等しいと見なされる要素は、ソートによって相対位置が変更される可能性があります。

5.6 数学関数 lua-lib-math

このライブラリは、標準 C 数学ライブラリのほとんどの関数へのインターフェースです。すべての関数をテーブル `math` 内に提供します。
math.abs({x}) math.abs()
{x} の絶対値を返します。
math.acos({x}) math.acos()
{x} の逆余弦(ラジアン単位)を返します。
math.asin({x}) math.asin()
{x} の逆正弦(ラジアン単位)を返します。
math.atan({x}) math.atan()
{x} の逆正接(ラジアン単位)を返します。
math.atan2({x}, {y}) math.atan2()
x/y の逆正接(ラジアン単位)を返しますが、両方のパラメーターの符号を使用して、結果の象限を見つけます。(また、{y} がゼロの場合も正しく処理します。)
math.ceil({x}) math.ceil()
{x} 以上の最小の整数を返します。
math.cos({x}) math.cos()
{x} の余弦(ラジアン単位であると想定)を返します。
math.cosh({x}) math.cosh()
{x} の双曲線余弦を返します。
math.deg({x}) math.deg()
角度 {x}(ラジアン単位で指定)を度単位で返します。
math.exp({x}) math.exp()
値 `e^x` を返します。
math.floor({x}) math.floor()
{x} 以下の最大の整数を返します。
math.fmod({x}, {y}) math.fmod()
{x}{y} で割った余りを返します。
math.frexp({x}) math.frexp()
x = m * 2^e となるような `m` と `e` を返します。e は整数であり、`m` の絶対値は範囲 `[0.5, 1)` にあります(または、{x} がゼロの場合はゼロ)。
math.huge math.huge
HUGE_VAL の値。これは、他の任意の数値以上の値です。
math.ldexp({m}, {e}) math.ldexp()
m * 2^e を返します(`e` は整数である必要があります)。
math.log({x}) math.log()
{x} の自然対数を返します。
math.log10({x}) math.log10()
{x} の底 10 の対数を返します。
math.max({x}, {...}) math.max()
引数の中で最大値を返します。
math.min({x}, {...}) math.min()
引数の中で最小値を返します。
math.modf({x}) math.modf()
2つの数値、{x} の整数部分と {x} の小数部分を返します。
math.pi math.pi
pi の値。
math.pow({x}, {y}) math.pow()
x^y を返します。(この値を計算するために、式 `x^y` を使用することもできます。)
math.rad({x}) math.rad()
角度 {x}(度単位で指定)をラジアン単位で返します。
math.random([{m} [, {n}]]) math.random()
この関数は、ANSI C によって提供される単純な疑似乱数生成関数 `rand` へのインターフェースです。(その統計的特性については保証できません。)
引数なしで呼び出された場合、範囲 `[0,1)` の疑似乱数実数を返します。数値 {m} で呼び出された場合、`math.random` は範囲 `[1, m]` の疑似乱数整数を返します。2つの数値 {m}{n} で呼び出された場合、`math.random` は範囲 `[m, n]` の疑似乱数整数を返します。
math.randomseed({x}) math.randomseed()
{x} を疑似乱数ジェネレーターの「シード」として設定します。同じシードは同じ数値列を生成します。
math.sin({x}) math.sin()
{x} の正弦(ラジアン単位であると想定)を返します。
math.sinh({x}) math.sinh()
{x} の双曲線正弦を返します。
math.sqrt({x}) math.sqrt()
{x} の平方根を返します。(この値を計算するために、式 `x^0.5` を使用することもできます。)
math.tan({x}) math.tan()
{x} の正接(ラジアン単位であると想定)を返します。
math.tanh({x}) math.tanh()
{x} の双曲線正接を返します。

5.6 入出力機能 lua-lib-io

I/O ライブラリは、ファイル操作に2つの異なるスタイルを提供します。最初のスタイルは暗黙的なファイル記述子を使用します。つまり、デフォルトの入力ファイルとデフォルトの出力ファイルを設定する操作があり、すべての入出力操作はこれらのデフォルトファイルに対して行われます。2番目のスタイルは明示的なファイル記述子を使用します。
暗黙的なファイル記述子を使用する場合、すべての操作はテーブル `io` によって提供されます。明示的なファイル記述子を使用する場合、操作 `io.open` はファイル記述子を返し、その後のすべての操作はファイル記述子のメソッドとして提供されます。
テーブル `io` は、C からの通常の意味を持つ3つの定義済みのファイル記述子も提供します。`io.stdin`、`io.stdout`、および `io.stderr` です。
特に明記されていない限り、すべての I/O 関数は失敗した場合は `nil`(加えて2番目の結果としてエラーメッセージ)を返し、成功した場合は `nil` と異なる値を返します。
io.close([{file}]) io.close()
file:close と同じです。{file} がない場合、デフォルトの出力ファイルを閉じます。
io.flush() io.flush()
デフォルトの出力ファイルに対して、`file:flush` と同じです。
io.input([{file}]) io.input()
ファイル名付きで呼び出された場合、指定された名前のファイル(テキストモード)を開き、そのハンドルをデフォルトの入力ファイルとして設定します。ファイルハンドルで呼び出された場合、このファイルハンドルをデフォルトの入力ファイルとして設定するだけです。パラメーターなしで呼び出された場合、現在のデフォルトの入力ファイルを返します。
エラーの場合、この関数はエラーコードを返すのではなく、エラーを発生させます。
io.lines([{filename}]) io.lines()
指定されたファイル名を読み取りモードで開き、呼び出されるたびにファイルから新しい行を返すイテレーター関数を返します。したがって、次の構成
for line in io.lines(filename) do body end
は、ファイルのすべての行を反復処理します。イテレーター関数がファイルの終端を検出すると、`nil`(ループを終了するため)を返し、自動的にファイルを閉じます。
io.lines() の呼び出し(ファイル名なし)は io.input():lines() と同等です。つまり、デフォルトの入力ファイルの行を反復処理します。この場合、ループが終了してもファイルは閉じられません。
io.open({filename} [, {mode}]) io.open()
この関数は、文字列 {mode} で指定されたモードでファイルを開きます。新しいファイルハンドルを返します。エラーの場合は、nil とエラーメッセージを返します。
{mode} 文字列には、次のいずれかを指定できます。
"r" 読み取りモード(デフォルト);
"w" 書き込みモード;
"a" 追加モード;
"r+" 更新モード、以前のデータはすべて保持されます;
"w+" 更新モード、以前のデータはすべて消去されます;
"a+" 追加更新モード、以前のデータは保持され、書き込みはファイルの末尾のみに許可されます。
{mode} 文字列の末尾に b を付けることもできます。これは、一部のシステムでファイルをバイナリモードで開くために必要です。この文字列は、標準C関数の fopen で使用されるものとまったく同じです。
io.output([{file}]) io.output()
io.input と同様ですが、デフォルトの出力ファイルに対して動作します。
io.popen({prog} [, {mode}]) io.popen()
プログラム {prog} を別のプロセスで開始し、このプログラムからデータを読み取る({mode}"r" の場合、デフォルト)またはこのプログラムにデータを書き込む({mode}"w" の場合)ために使用できるファイルハンドルを返します。
この関数はシステムに依存し、すべてのプラットフォームで使用できるわけではありません。
io.read({...}) io.read()
io.input():read と同等です。
io.tmpfile() io.tmpfile()
一時ファイルのハンドルを返します。このファイルは更新モードで開かれ、プログラムが終了すると自動的に削除されます。
io.type({obj}) io.type()
{obj} が有効なファイルハンドルかどうかを確認します。{obj} が開いているファイルハンドルの場合は文字列 "file"{obj} が閉じているファイルハンドルの場合は "closed file" を返し、{obj} がファイルハンドルでない場合は nil を返します。
io.write({...}) io.write()
io.output():write と同等です。
file:close() file:close()
file を閉じます。ファイルはハンドルがガベージコレクションされると自動的に閉じられますが、それが発生するまでに予測できない時間がかかることに注意してください。
file:flush() file:flush()
file に書き込まれたデータを保存します。
file:lines() file:lines()
呼び出されるたびに、ファイルから新しい行を返す イテレータ関数を返します。したがって、次の構成は
for line in file:lines() do body end
ファイル内のすべての行を反復処理します。(io.lines とは異なり、この関数はループが終了してもファイルを閉じません。)
file:read({...}) file:read()
読み取る内容を指定する指定された形式に従って、ファイル file を読み取ります。各形式について、関数は読み取られた文字を含む文字列(または数値)を返します。指定された形式でデータを読み取ることができない場合は nil を返します。形式を指定せずに呼び出された場合、次の行全体を読み取るデフォルトの形式を使用します(下記参照)。
使用可能な形式は次のとおりです。
"*n" は数値を読み取ります。これは、文字列ではなく数値を返す唯一の形式です。"*a" は、現在の位置から始まるファイル全体を読み取ります。ファイルの終わりに、空の文字列を返します。"*l" は次の行を読み取ります(行末をスキップします)。ファイルの終わりに nil を返します。これがデフォルトの形式です。number は、最大でその数の文字を含む文字列を読み取ります。ファイルの終わりに nil を返します。数値がゼロの場合、何も読み取らずに空の文字列を返します。ファイルの終わりには nil を返します。
file:seek([{whence}] [, {offset}]) file:seek()
ファイルの先頭から測定したファイル位置を、文字列 {whence} で指定されたベースと、{offset} を加えた位置に設定および取得します。次のようにします。
"set": ベースは位置 0(ファイルの先頭)です。
"cur": ベースは現在の位置です。
"end": ベースはファイルの末尾です。
成功した場合、関数 seek は、ファイルの先頭からバイト単位で測定した最終的なファイル位置を返します。この関数が失敗した場合、nil とエラーを説明する文字列を返します。
{whence} のデフォルト値は "cur" で、{offset} のデフォルト値は 0 です。したがって、file:seek() の呼び出しは、現在のファイル位置を返すだけで、変更しません。file:seek("set") の呼び出しは、位置をファイルの先頭に設定し(0 を返します)、file:seek("end") の呼び出しは、位置をファイルの末尾に設定し、そのサイズを返します。
file:setvbuf({mode} [, {size}]) file:setvbuf()
出力ファイルのバッファリングモードを設定します。使用可能なモードは3つあります。
"no" バッファリングなし。出力操作の結果はすぐに表示されます。"full" フルバッファリング。出力操作は、バッファが満杯になったとき(または明示的にファイルの flush を実行したとき(io.flush() を参照)にのみ実行されます。 "line" 行バッファリング。出力は、改行が出力されるか、一部の特別なファイル(ターミナルデバイスなど)から入力があるまでバッファリングされます。
最後の2つのケースでは、{size} はバッファのサイズをバイト単位で指定します。デフォルトは適切なサイズです。
file:write({...}) file:write()
その引数のそれぞれの値を file に書き込みます。引数は文字列または数値である必要があります。他の値を書き込むには、tostring tostring() または string.format string.format()write の前に使用します。

5.8 オペレーティングシステム機能 lua-lib-os

このライブラリは、テーブル os を通じて実装されます。
os.clock() os.clock()
プログラムで使用された CPU 時間の秒単位の概算値を返します。
os.date([{format} [, {time}]]) os.date()
与えられた文字列 {format} に従ってフォーマットされた、日付と時刻を含む文字列またはテーブルを返します。
{time} 引数が存在する場合、これはフォーマットする時間です(この値の説明については、os.time 関数 os.time() を参照)。それ以外の場合、date は現在の時刻をフォーマットします。
{format}! で始まる場合、日付は協定世界時でフォーマットされます。このオプションの文字の後に、{format} が文字列 "*t" の場合、date は次のフィールドを持つテーブルを返します。year(4桁)、month(1〜12)、day(1〜31)、hour(0〜23)、min(0〜59)、sec(0〜61)、wday(曜日、日曜日は1)、yday(年の日)、および isdst(夏時間フラグ、ブール値)。
{format}"*t" でない場合、date はC関数 strftime と同じ規則に従ってフォーマットされた日付を文字列として返します。
引数なしで呼び出された場合、date はホストシステムと現在のロケールに依存する適切な日付と時刻の表現を返します(つまり、os.date()os.date("%c") と同等です)。
os.difftime({t2}, {t1}) os.difftime()
時間 {t1} から時間 {t2} までの秒数を返します。POSIX、Windows、およびその他のシステムでは、この値は正確に t2 - t1 です。
os.execute([{command}]) os.execute()
この関数は、C関数 system と同等です。オペレーティングシステムのシェルによって実行される {command} を渡します。システムに依存するステータスコードを返します。{command} がない場合は、シェルが使用可能な場合はゼロ以外の値を返し、それ以外の場合はゼロを返します。
os.exit([{code}]) os.exit()
オプションの {code} を指定してC関数 exit を呼び出して、ホストプログラムを終了します。{code} のデフォルト値は成功コードです。
os.getenv({varname}) os.getenv()
プロセス環境変数 {varname} の値を返します。または、変数が定義されていない場合は nil を返します。
os.remove({filename}) os.remove()
指定された名前のファイルを削除します。削除するには、ディレクトリが空である必要があります。この関数が失敗した場合、nil とエラーを説明する文字列を返します。
os.rename({oldname}, {newname}) os.rename()
{oldname} という名前のファイルを {newname} に変更します。この関数が失敗した場合、nil とエラーを説明する文字列を返します。
os.setlocale({locale} [, {category}]) os.setlocale()
プログラムの現在のロケールを設定します。{locale} はロケールを指定する文字列です。{category} は変更するカテゴリを説明するオプションの文字列です:"all""collate""ctype""monetary""numeric"、または "time"。デフォルトのカテゴリは "all" です。関数は、新しいロケールの名前を返します。または、リクエストに応じられない場合は nil を返します。
os.time([{table}]) os.time()
引数なしで呼び出された場合は現在の時刻を返し、または指定されたテーブルで指定された日付と時刻を表す時刻を返します。このテーブルには、yearmonth、および day のフィールドが含まれている必要があり、hourminsec、および isdst のフィールドが含まれている場合があります(これらのフィールドの説明については、os.date 関数 os.date() を参照)。
返される値は数値であり、その意味はシステムによって異なります。POSIX、Windows、およびその他のシステムでは、この数値は特定の開始時刻(「エポック」)からの秒数をカウントします。他のシステムでは、意味は指定されておらず、time によって返される数値は date および difftime の引数としてのみ使用できます。
os.tmpname() os.tmpname()
一時ファイルに使用できるファイル名を含む文字列を返します。ファイルは、使用する前に明示的に開く必要があり、不要になったら明示的に削除する必要があります。

5.9 デバッグライブラリ lua-lib-debug

このライブラリは、Luaプログラムへのデバッグインターフェースの機能を提供します。このライブラリを使用する際には注意が必要です。ここで提供される関数は、デバッグやプロファイリングなどの同様のタスクにのみ使用する必要があります。通常のプログラミングツールとして使用する誘惑に抵抗してください。非常に遅くなる可能性があります。さらに、いくつかの関数は、Luaコードに関するいくつかの前提(例えば、関数のローカル変数が外部からアクセスできないことや、userdataメタテーブルがLuaコードによって変更できないことなど)に違反しているため、他の点では安全なコードを損なう可能性があります。
このライブラリのすべての関数は、debugテーブル内で提供されます。スレッドを操作するすべての関数には、操作対象のスレッドであるオプションの最初の引数があります。デフォルトは常に現在のスレッドです。
debug.debug() debug.debug()
ユーザーとのインタラクティブモードに入り、ユーザーが入力した各文字列を実行します。簡単なコマンドやその他のデバッグ機能を使用して、ユーザーはグローバル変数やローカル変数を調べたり、値を変更したり、式を評価したりできます。contという単語のみを含む行は、この関数を終了させ、呼び出し元が実行を続行します。
debug.debugのコマンドは、どの関数にも字句的にネストされていないため、ローカル変数に直接アクセスできないことに注意してください。
debug.getfenv(o) debug.getfenv()
オブジェクト{o}の環境を返します。
debug.gethook([{thread}]) debug.gethook()
スレッドの現在のフック設定を、3つの値として返します。現在のフック関数、現在のフックマスク、および現在のフックカウント(debug.sethook関数によって設定されたもの)。
debug.getinfo([{thread},] {function} [, {what}]) debug.getinfo()
関数に関する情報を含むテーブルを返します。関数を直接指定することも、{function}の値として数値を指定することもできます。これは、指定されたスレッドのコールスタックのレベル{function}で実行されている関数を意味します。レベル0は現在の関数(getinfo自体)、レベル1はgetinfoを呼び出した関数です。{function}がアクティブな関数の数よりも大きい数値の場合、getinfonilを返します。
返されるテーブルには、lua_getinfolua_getinfo()を参照)によって返されるすべてのフィールドが含まれている可能性があり、文字列{what}は、どのフィールドを埋めるかを記述します。{what}のデフォルトは、有効な行のテーブルを除き、利用可能なすべての情報を取得することです。fオプションが存在する場合、関数自体を含むfuncという名前のフィールドを追加します。Lオプションが存在する場合、有効な行のテーブルを含むactivelinesという名前のフィールドを追加します。
例えば、式debug.getinfo(1,"n").nameは、妥当な名前が見つかれば、現在の関数の名前を返し、debug.getinfo(print)は、print関数に関する利用可能なすべての情報を含むテーブルを返します。
debug.getlocal([{thread},] {level}, {local}) debug.getlocal()
この関数は、スタックのレベル{level}にある関数の、インデックス{local}を持つローカル変数の名前と値を返します。(最初のパラメータまたはローカル変数のインデックスは1から始まり、最後のアクティブなローカル変数まで続きます。)指定されたインデックスを持つローカル変数がない場合、関数はnilを返し、範囲外の{level}で呼び出された場合はエラーを発生させます。(debug.getinfo debug.getinfo()を呼び出して、レベルが有効かどうかを確認できます。)
( (開き括弧) で始まる変数名は、内部変数(ループ制御変数、一時変数、C 関数のローカル変数)を表します。
debug.getmetatable({object}) debug.getmetatable()
指定された{object}のメタテーブルを返します。メタテーブルがない場合はnilを返します。
debug.getregistry() debug.getregistry()
レジストリテーブルを返します(lua-registryを参照)。
debug.getupvalue({func}, {up}) debug.getupvalue()
この関数は、関数{func}の、インデックス{up}を持つアップバリューの名前と値を返します。指定されたインデックスを持つアップバリューがない場合、関数はnilを返します。
debug.setfenv({object}, {table}) debug.setfenv()
指定された{object}の環境を指定された{table}に設定します。{object}を返します。
debug.sethook([{thread},] {hook}, {mask} [, {count}]) debug.sethook()
指定された関数をフックとして設定します。文字列{mask}と数値{count}は、フックがいつ呼び出されるかを記述します。文字列マスクには、次の文字を含めることができ、与えられた意味を持ちます。
"c" : Luaが関数を呼び出すたびにフックが呼び出されます。
"r" : Luaが関数から戻るたびにフックが呼び出されます。
"l" : Luaが新しいコード行に入るときにフックが呼び出されます。
{count}がゼロ以外の場合、フックは{count}個の命令ごとに呼び出されます。
引数なしで呼び出された場合、debug.sethookはフックをオフにします。
フックが呼び出されると、その最初のパラメータは、呼び出しをトリガーしたイベントを記述する文字列です:"call""return"(または"tail return"`)、"line"、および"count"。行イベントの場合、フックは2番目のパラメータとして新しい行番号も取得します。フック内では、イベントが"tail return"でない限り、レベル2でgetinfoを呼び出して、実行中の関数に関する詳細情報(レベル0はgetinfo関数、レベル1はフック関数)を取得できます。この場合、Luaは戻りをシミュレートしているだけで、getinfoを呼び出すと無効なデータが返されます。
debug.setlocal([{thread},] {level}, {local}, {value}) debug.setlocal()
この関数は、スタックのレベル{level}にある関数の、インデックス{local}を持つローカル変数に値{value}を代入します。指定されたインデックスを持つローカル変数がない場合、関数はnilを返し、範囲外の{level}で呼び出された場合はエラーを発生させます。(getinfoを呼び出して、レベルが有効かどうかを確認できます。)それ以外の場合は、ローカル変数の名前を返します。
debug.setmetatable({object}, {table}) debug.setmetatable()
指定された{object}のメタテーブルを指定された{table}nilにすることもできます)に設定します。
debug.setupvalue({func}, {up}, {value}) debug.setupvalue()
この関数は、関数{func}の、インデックス{up}を持つアップバリューに値{value}を代入します。指定されたインデックスを持つアップバリューがない場合、関数はnilを返します。それ以外の場合は、アップバリューの名前を返します。
debug.traceback([{thread},] [{message} [,{level}]]) debug.traceback()
コールスタックのトレースバックを含む文字列を返します。オプションの{message}文字列は、トレースバックの先頭に追加されます。オプションの{level}数値は、トレースバックを開始するレベルを示します(デフォルトは1、tracebackを呼び出す関数)。

参考文献 lua-ref-bibliography

このヘルプファイルは、この主要な参考文献からのわずかな改作です。
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes., "Lua: 5.1 reference manual", https://lua.dokyumento.jp/manual/5.1/manual.html
Luaについては、次の参考文献で議論されています。
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes., "Lua --- an extensible extension language". "Software: Practice & Experience" 26, 6 (1996) 635-652.
L. H. de Figueiredo, R. Ierusalimschy, and W. Celes., "The design and implementation of a language for extending applications". "Proc. of XXI Brazilian Seminar on Software and Hardware" (1994) 273-283.
L. H. de Figueiredo, R. Ierusalimschy, and W. Celes., "Lua: an extensible embedded language". "Dr. Dobb's Journal" 21, 12 (Dec 1996) 26-33.
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes., "The evolution of an extension language: a history of Lua". "Proc. of V Brazilian Symposium on Programming Languages" (2001) B-14-B-28.
このヘルプファイルは、Lua 5.1およびLua 5.1マニュアルと同じ著作権とライセンスを持っています。
Copyright (c) 1994-2006 Lua.org, PUC-Rio.
このソフトウェアおよび関連ドキュメントファイル(「ソフトウェア」)のコピーを入手した人には、ソフトウェアの利用、コピー、変更、結合、公開、配布、サブライセンス、および/またはソフトウェアのコピーの販売を含む、ソフトウェアの取り扱いを制限なしに行うための許可が、以下の条件に従って、無料で付与されます。
上記の著作権表示とこの許可表示は、ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。
ソフトウェアは、「現状のまま」提供され、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的なあらゆる種類の保証を伴いません。いかなる場合も、作者または著作権保持者は、契約、不法行為、またはその他の行為において、ソフトウェア、ソフトウェアの使用、またはその他の取引から生じる、または関連する、いかなる請求、損害、またはその他の責任についても責任を負わないものとします。

C LUAREF DOC lua-ref-doc

これは、Lua 5.1のリファレンスを含むVimヘルプファイルであり、いくつかの例外と改作を除いて、Lua 5.1リファレンスマニュアルのコピーです(lua-ref-bibliographyを参照)。使用法については、lua-ref-docを参照してください。著作権情報については、lua-ref-copyrightを参照してください。
このリファレンスを実装する方法に関する主なアイデアと概念は、Christian HabermannのCRefVimプロジェクト(https://www.vim.org/scripts/script.php?script_id=614)から取得されました。
バンドルされた Nvim ドキュメント用に調整されました。オリジナルのプラグインは https://www.vim.org/scripts/script.php?script_id=1291 にあります。
メイン
コマンド索引
クイックリファレンス