Nvimの:helpページは、生成されたもので、ソースをtree-sitter-vimdocパーサーを使って解析したものです。
{ a }は0個以上のaを意味し、[ a ]はオプションのaを意味します。and break do else elseif end false for function if in local nil not or repeat return then true until while
andは予約語ですが、AndとANDは異なる有効な名前です。慣例として、アンダースコアに続けて大文字で始まる名前(_VERSIONなど)は、Luaで使用される内部グローバル変数用に予約されています。+ - * / % ^ #
== ~= <= >= < > =
( ) { } [ ]
; : , . .. ...
\a ベル\b バックスペース\f 改ページ\n 改行\r キャリッジリターン\t 水平タブ\v 垂直タブ\\ バックスラッシュ\" 引用符(二重引用符)\' アポストロフィ(単一引用符)\dddを使用して、その数値で指定することもできます。dddは、最大3桁の10進数のシーケンスです。(数値エスケープの後に数字が続く場合は、正確に3桁で表現する必要があることに注意してください。)Luaの文字列には、埋め込みゼロを含む任意の8ビット値を格納できます。埋め込みゼロは\0として指定できます。[[と記述され、レベル1の開始長い括弧は[=[と記述され、以下同様です。終了長い括弧は同様に定義されます。たとえば、レベル4の終了長い括弧は]====]と記述されます。長い文字列は、任意のレベルの開始長い括弧で始まり、同じレベルの最初の終了長い括弧で終わります。この括弧形式のリテラルは、複数行にわたって記述でき、エスケープシーケンスを解釈せず、他のレベルの長い括弧を無視します。適切なレベルの終了括弧を除く、あらゆるものを含めることができます。aが97、改行が10、1が49としてコード化されている場合)、以下の5つのリテラルは同じ文字列を表します。a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]
a = [==[
alo
123"]==]
0xをプレフィックスとして付けることで、整数の16進定数も受け入れます。有効な数値定数の例を次に示します。3 3.0 3.1416 314.16e-2 0.31416E1 0xff 0x56
--)で始まります。--の直後のテキストが開始長い括弧でない場合、コメントは行末まで続く短いコメントです。そうでない場合は、対応する終了長い括弧まで続く長いコメントです。長いコメントは、コードを一時的に無効にするためによく使用されます。nil、boolean、number、string、function、userdata、thread、およびtableの8つの基本型があります。Nilは値nilの型であり、その主な特性は他のどの値とも異なることです。通常、有用な値がないことを表します。Booleanは、値falseとtrueの型です。nilとfalseの両方が条件を偽にします。他の値はすべて真にします。Numberは、実数(倍精度浮動小数点)数を表します。(単精度浮動小数点数や長整数など、他の内部表現を数値に使用するLuaインタープリターを簡単に構築できます。ファイルluaconf.hを参照してください。)Stringは、文字の配列を表します。Luaは8ビットクリーンです。文字列には、埋め込みゼロ(\0)を含む任意の8ビット文字を含めることができます(lua-literalを参照)。threadは、実行の独立したスレッドを表し、コルーチンを実装するために使用されます(lua-coroutineを参照)。Luaスレッドをオペレーティングシステムのスレッドと混同しないでください。Luaは、スレッドをサポートしていないシステムでも、すべてのシステムでコルーチンをサポートします。tableは、連想配列を実装します。つまり、数値だけでなく、任意の値(nilを除く)でインデックス付けできる配列です。テーブルは異種にすることができます。つまり、すべての型(nilを除く)の値を含めることができます。テーブルは、Luaにおける唯一のデータ構造化メカニズムです。テーブルを使用して、通常の配列、シンボルテーブル、セット、レコード、グラフ、ツリーなどを表すことができます。レコードを表すために、Luaはフィールド名をインデックスとして使用します。言語は、a.nameをa["name"]の糖衣構文として提供することで、この表現をサポートします。Luaでテーブルを作成するための便利な方法がいくつかあります(lua-tableconstructorを参照)。nilを除く)にできます。特に、関数は第一級の値であるため、テーブルフィールドには関数を含めることができます。したがって、テーブルはメソッドを保持することもできます(lua-function-defineを参照)。typeは、指定された値の型を記述する文字列を返します(lua-type()を参照)。format 関数を使用します ( string.format() を参照)。var ::= Name
nil です。var ::= prefixexp [ exp ]
prefixexp) はテーブル値を生成する必要があります。2 番目の式 (exp) は、そのテーブル内の特定のエントリを識別します。インデックス付けされるテーブルを示す式には、構文上の制限があります。詳細については、lua-expressions を参照してください。var.NAME は、var["NAME"] の糖衣構文です。var ::= prefixexp . Name
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 では定義されておらず、呼び出すこともできません。ここでは説明のためだけに使用しています)。chunk ::= {stat [ ; ]}
;; は有効ではありません。luac を参照してください。ソース形式とコンパイル形式のプログラムは交換可能です。Lua はファイルタイプを自動的に検出し、それに応じて動作します。block ::= chunk
return または break ステートメントを追加するためにも使用されることがあります ( lua-control を参照)。stat ::= varlist1 = explist1
varlist1 ::= var { , var }
explist1 ::= exp { , exp }
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
x と y の値を交換します。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 では定義されていません。ここでは説明のためだけに使用しています)。if、while、および repeat は、通常の意味と慣れ親しんだ構文を持っています。stat ::= while exp do block end
stat ::= repeat block until exp
stat ::= if exp then block { elseif exp then block }
[ else block ] end
for ステートメントもあります ( lua-for を参照)。false と nil の両方が false と見なされます。nil と false 以外のすべての値は true と見なされます (特に、数値 0 と空の文字列も true です)。repeat-until ループでは、内部ブロックは until キーワードで終了するのではなく、条件の後でのみ終了します。したがって、条件はループブロック内で宣言されたローカル変数を参照できます。return ステートメントは、関数またはチャンク (これは単なる関数です) から値を返すために使用されます。関数とチャンクは複数の値を返すことができるため、return ステートメントの構文は次のようになります。stat ::= return [explist1]stat ::= breakbreak は、最も内側の包含ループを終了します。return および break ステートメントは、ブロックの last ステートメントとしてのみ記述できます。ブロックの途中で return または break することが本当に必要な場合は、do return end および do break end というイディオムのように、明示的な内部ブロックを使用できます。これは、return および break がそれらの (内部) ブロック内の最後のステートメントになったためです。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
var、limit、および step は、不可視変数です。名前は、説明のためだけにここにあります。break を使用して for ループを終了できます。var はループに対してローカルです。for が終了または中断された後、その値を使用することはできません。この値が必要な場合は、ループを中断または終了する前に、別の変数に代入してください。for ステートメントは、イテレーターと呼ばれる関数に対して機能します。反復ごとに、新しい値を生成するためにイテレーター関数が呼び出され、この新しい値が nil になると停止します。ジェネリック for ループには、次の構文があります。stat ::= for namelist in explist1 do block end
namelist ::= Name { , Name }
for ステートメントfor var1, ..., varn in explist do block enddo
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、および最初のイテレーター変数の初期値です。f、s、および var は、不可視変数です。名前は、説明のためだけにここにあります。break を使用して for ループを終了できます。var1, ..., varn は、ループに対してローカルです。for が終了した後、それらの値を使用することはできません。これらの値が必要な場合は、ループを中断または終了する前に、他の変数に代入してください。stat ::= functioncall
stat ::= local namelist [ = explist1 ]
namelist ::= Name { , Name }
nil で初期化されます。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-function-defineで説明されています。not(lua-logicalop参照)、および単項長演算子(lua-length参照)が含まれます。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
fが複数の値を返す場合でも、(f(x,y,z))は常に単一の値になります。((f(x,y,z))の値は、fが返す最初の値、またはfが値を返さない場合はnilです。)+(加算)、-(減算)、*(乗算)、/(除算)、%(剰余)、および^(べき乗)、そして単項演算子の-(否定)をサポートしています。オペランドが数値、または数値に変換できる文字列(lua-coercion参照)の場合、すべての演算は通常の意味を持ちます。べき乗は任意の指数で機能します。たとえば、x^(-0.5)はxの平方根の逆数を計算します。剰余は次のように定義されます。a % b == a - math.floor(a/b)*b
== ~= < > <= >=
falseまたはtrueを返します。==)は、最初にオペランドの型を比較します。型が異なる場合、結果はfalseです。それ以外の場合は、オペランドの値が比較されます。数値と文字列は通常の方法で比較されます。オブジェクト(テーブル、userdata、スレッド、および関数)は参照によって比較されます。2つのオブジェクトは、同じオブジェクトである場合にのみ等しいと見なされます。新しいオブジェクト(テーブル、userdata、または関数)を作成するたびに、この新しいオブジェクトは、以前に存在したオブジェクトとは異なります。~=は、等価(==)の否定です。and or not
notは常にfalseまたはtrueを返します。連言演算子andは、この値がfalseまたはnilの場合は最初の引数を返し、それ以外の場合は2番目の引数を返します。選言演算子orは、この値がnilおよびfalseと異なる場合は最初の引数を返し、それ以外の場合は2番目の引数を返します。andとorの両方がショートカット評価を使用します。つまり、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
-->は先行する式の結果を示します。)..)で示されます。両方のオペランドが文字列または数値の場合、lua-coercionで説明されている規則に従って文字列に変換されます。それ以外の場合は、「concat」メタメソッドが呼び出されます(lua-metatable参照)。#で示されます。文字列の長さは、そのバイト数です(つまり、各文字が1バイトの場合の文字列長の通常の意味)。tの長さは、t[n]がnilでなく、t[n+1]がnilであるような任意の整数インデックスnとして定義されます。さらに、t[1]がnilの場合、nはゼロになる可能性があります。1から特定のnまでの非nil値を持つ通常の配列の場合、その長さは正確にそのn、つまりその最後の値のインデックスです。配列に「穴」(つまり、他の非nil値の間のnil値)がある場合、#tはnil値の直前にあるインデックスのいずれかである可能性があります(つまり、そのようなnil値を配列の末尾と見なす可能性があります)。or and < > <= >= ~= == .. + - * / not # - (unary) ^
..)演算子とべき乗(^)演算子は右結合です。他のすべての二項演算子は左結合です。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参照)。functioncall ::= prefixexp args
prefixexpとargsが評価されます。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 ')の構文糖です。つまり、引数リストは単一のリテラル文字列です。(の前に改行を入れることはできません。この制限により、言語の曖昧さが回避されます。次のように記述すると、a = f
(g).x(a)
a = f(g).x(a)として認識します。したがって、2つのステートメントが必要な場合は、それらの間にセミコロンを追加する必要があります。実際にfを呼び出す場合は、(g)の前の改行を削除する必要があります。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
function ::= function funcbody funcbody ::= ( [ parlist1 ] ) block end
stat ::= function funcname funcbody
stat ::= local function Name funcbody
funcname ::= Name { . Name } [ : Name ]
function f () body endf = function () body endfunction t.a.b.c.f () body endt.a.b.c.f = function () body endlocal function f () body endlocal f; f = function f () body endlocal f = function f () body endfへの参照を含む場合にのみ違いが生じます。)function型を持つ実行可能な式です。Luaがチャンクをプリコンパイルするとき、その関数本体もすべてプリコンパイルされます。そして、Luaが関数定義を実行するたびに、関数がインスタンス化(またはクロージャ化)されます。この関数インスタンス(またはクロージャ)が式の最終的な値です。同じ関数の異なるインスタンスは、異なる外部ローカル変数や異なる環境テーブルを参照する可能性があります。parlist1 ::= namelist [ , ... ] | ...
...)で示されます。可変長引数関数は引数リストを調整しません。代わりに、すべての余分な引数を収集し、それらを可変長引数式(これも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
function t.a.b.c:f ( params ) body endt.a.b.c:f = function ( self, params ) body endx = 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は外部の変数を参照することに注意してください。a = {}
local x = 20
for i=1,10 do
local y = 0
a[i] = function () y=y+1; return x+y end
end
y変数を使用しますが、すべて同じxを共有します。error関数(error()を参照)を呼び出すことで、明示的にエラーを生成できます。Luaでエラーをキャッチする必要がある場合は、pcall関数(pcall()を参照)を使用できます。"__add"で関数を確認します。見つかった場合、Luaはその関数を呼び出して加算を実行します。getmetatable関数(getmetatable()を参照)を使用して、任意の値のメタテーブルをクエリできます。setmetatable関数(setmetatable()を参照)を使用して、テーブルのメタテーブルを置き換えることができます。Luaから他の型のメタテーブルを変更することはできません(デバッグライブラリを使用する場合を除く)。そのためにはC APIを使用する必要があります。__が付いた文字列です。たとえば、操作「add」のキーは文字列「__add」です。これらの操作のセマンティクスは、インタープリターがその操作をどのように実行するかを記述するLua関数によってより適切に説明されます。rawget、tonumberなど)は、lua-lib-coreで説明されています。特に、特定のオブジェクトのメタメソッドを取得するために、式を使用します。metatable(obj)[event]
rawget(metatable(obj) or {}, event)
nilになります)。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
-演算。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
..(連結)演算。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
#演算。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
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
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 ~= bはnot (a == b)と同等です。<演算。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 > bはb < aと同等です。<=演算。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 >= bはb <= aと同等です。「le」メタメソッドがない場合、Luaはa <= bがnot (b < a)と同等であると仮定して、「lt」を試行することに注意してください。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
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
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
setfenvを呼び出すことで変更できます。Lua関数または実行中のスレッドの環境は、getfenvを呼び出すことで取得できます(lua_getfenv()を参照)。他のオブジェクト(userdata、C関数、他のスレッド)の環境を操作するには、C APIを使用する必要があります。lua_gc(lua_gc()を参照)、Luaではcollectgarbage(collectgarbage()を参照)を呼び出すことで変更できます。どちらもパーセントポイントを引数として受け取ります(したがって、引数100は実際の値1を意味します)。これらの関数を使用すると、コレクターを直接制御することもできます(例えば、停止と再開)。__gcを持つガベージuserdataは、ガベージコレクターによってすぐに収集されません。代わりに、Luaはそれらをリストに入れます。収集後、Luaはそのリスト内の各userdataに対して、次の関数と同等の処理を行います。function gc_event (udata)
local h = metatable(udata).__gc
if h then
h(udata)
end
end
__modeフィールドの値によって制御されます。__modeフィールドが文字kを含む文字列の場合、テーブル内のキーは弱くなります。__modeにvが含まれている場合、テーブル内の値は弱くなります。__modeの値を変更しないでください。そうしないと、このメタテーブルによって制御されるテーブルの弱い動作は未定義になります。coroutine.create(coroutine.create()を参照)を呼び出すことで作成します。唯一の引数は、コルーチンのメイン関数である関数です。create関数は新しいコルーチンを作成し、そのハンドル(thread型のオブジェクト)を返すだけです。コルーチンの実行は開始しません。coroutine.resume(coroutine.resume()を参照)を初めて呼び出すときに、最初の引数としてcoroutine.createによって返されたスレッドを渡すと、コルーチンの実行がメイン関数の最初の行から開始されます。coroutine.resumeに渡された追加の引数は、コルーチンのメイン関数に渡されます。コルーチンが実行を開始すると、終了するかyieldするまで実行されます。coroutine.resumeはtrueと、コルーチンのメイン関数によって返されたすべての値を返します。エラーの場合、coroutine.resumeはfalseとエラーメッセージを返します。coroutine.yield(coroutine.yield()を参照)を呼び出すことでyieldします。コルーチンがyieldすると、対応するcoroutine.resumeは、yieldがネストされた関数呼び出しの内側で発生した場合(つまり、メイン関数ではなく、メイン関数によって直接的または間接的に呼び出された関数の場合)でも、すぐに戻ります。yieldの場合、coroutine.resumeはtrueと、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
lua.hで宣言されています。macroとして提供される場合があります。このようなマクロはすべて、各引数を正確に1回使用します(最初の引数は常にLuaの状態であるため、除く)。したがって、隠れた副作用は生成されません。luaconf.hでマクロluai_apicheckに適切な定義をしてLuaをコンパイルすることで、この動作を変更できます。nil、数値、文字列など)を表します。n個の要素がある場合、インデックス1は最初の要素(つまり、最初にスタックにプッシュされた要素)を表し、インデックスnは最後の要素を表します。インデックス-1も最後の要素(つまり、最上部の要素)を表し、インデックス-nは最初の要素を表します。インデックスが1とスタックトップの間にある場合(つまり、1 <= abs(index) <= topの場合)、有効であると言います。lua_checkstackを使用して、スタックサイズを拡大できます(lua_checkstack()を参照)。LUA_MINSTACK個のスタック位置が使用可能であることを保証します。LUA_MINSTACKは20として定義されているため、コードがスタックに要素をプッシュするループがない限り、通常はスタック領域を心配する必要はありません。lua_checkstackを使用して設定した最大スタックサイズまでのインデックスです。このようなインデックスは、許容可能なインデックスと呼ばれます。より正式には、許容可能なインデックスを次のように定義します。(index < 0 && abs(index) <= top) || (index > 0 && index <= stackspace)
LUA_GLOBALSINDEXにあります。実行中のC関数の環境は、常に擬似インデックスLUA_ENVIRONINDEXにあります。lua_getfield(L, LUA_GLOBALSINDEX, varname);
lua_upvalueindexによって生成されます。関数に関連付けられた最初の値は、位置lua_upvalueindex(1)にあり、以下同様です。lua_upvalueindex( n )へのアクセスは、nが現在の関数のアップバリューの数より大きい場合、許容される(が無効な)インデックスを生成します。LUA_REGISTRYINDEXに配置されます。任意のCライブラリがこのテーブルにデータを格納できますが、他のライブラリで使用されるキーと異なるキーを選択して、衝突を避けるように注意する必要があります。通常、ライブラリ名を含む文字列、またはコード内のCオブジェクトのアドレスを持つライトuserdataをキーとして使用する必要があります。longjmp機能を使用してエラーを処理します。(C++を使用している場合は、例外を使用することもできます。luaconf.hファイルを参照してください。)Luaがエラー(メモリ割り当てエラー、型エラー、構文エラー、ランタイムエラーなど)に直面すると、エラーが発生します。つまり、long jumpを実行します。保護された環境では、setjmpを使用してリカバリポイントを設定します。エラーは、最新のアクティブなリカバリポイントにジャンプします。lua_newstate、lua_close、lua_load、lua_pcall、およびlua_cpcall(lua_newstate()、lua_close()、lua_load()、lua_pcall()、およびlua_cpcall()を参照)。lua_errorを呼び出すことによってエラーを発生させることができます(lua_error()を参照)。reallocと同様の機能を提供する必要がありますが、まったく同じではありません。その引数は、ud、lua_newstateに渡される不透明なポインタ(lua_newstate()を参照)、ptr、割り当て/再割り当て/解放されるブロックへのポインタ、osize、ブロックの元のサイズ、nsize、ブロックの新しいサイズです。ptrは、osizeがゼロの場合にのみNULLになります。nsizeがゼロの場合、アロケータはNULLを返す必要があります。osizeがゼロでない場合は、ptrが指すブロックを解放する必要があります。nsizeがゼロでない場合、アロケータはリクエストを満たすことができない場合にのみNULLを返します。nsizeがゼロではなく、osizeがゼロの場合、アロケータはmallocのように動作する必要があります。nsizeとosizeがゼロでない場合、アロケータは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は両方の動作を保証します。panic functionを呼び出し、次にexit(EXIT_FAILURE)を呼び出して、ホストアプリケーションを終了します。パニック関数は、決して戻らない(たとえば、long jumpを実行する)ことで、この終了を回避できます。lua_callを呼び出します。nargsは、スタックにプッシュした引数の数です。すべての引数と関数の値は、関数が呼び出されるときにスタックからポップされます。関数の結果は、関数が戻るときにスタックにプッシュされます。結果の数はnresultsに調整されます。ただし、nresultsがLUA_MULTRETの場合は除きます。この場合、関数からのallの結果がプッシュされます。Luaは、返された値がスタックスペースに収まるようにします。関数の結果は直接の順序でスタックにプッシュされます(最初の結果が最初にプッシュされます)。したがって、呼び出し後、最後の結果がスタックの最上部にあります。longjmpで)上位に伝播されます。a = f("how", t.x, 14)
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_gettop(L)(lua_gettop()を参照)は関数が受け取った引数の数を返します。最初の引数(存在する場合)はインデックス1にあり、最後の引数はインデックスlua_gettop(L)にあります。Luaに値を返すには、C関数はそれらをスタックに直接の順序でプッシュし(最初の結果が最初にプッシュされます)、結果の数を返します。結果の下にあるスタック内の他の値はすべて、Luaによって適切に破棄されます。Lua関数のように、Luaによって呼び出されるC関数も多くの結果を返すことができます。static int foo (lua_State *L) {
int n = lua_gettop(L); /* number of arguments */
lua_Number sum = 0;
int i;
for (i = 1; i <= 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 */
}
extra個の空きスタックスロットがあることを確認します。スタックをそのサイズまで拡張できない場合は、falseを返します。この関数はスタックを縮小しません。スタックが新しいサイズよりすでに大きい場合、変更されずに残されます。n個の値を連結し、それらをポップして、結果を最上部に残します。nが1の場合、結果はスタック上の単一の文字列です(つまり、関数は何もしません)。nが0の場合、結果は空の文字列です。連結は、Luaの通常のセマンティクスに従って行われます(lua-concatを参照)。funcを保護モードで呼び出します。funcは、スタックに1つの要素(udを含むライトuserdata)のみで開始します。エラーの場合、lua_cpcallはlua_pcallと同じエラーコードを返し(lua_pcall()を参照)、スタックの最上部にエラーオブジェクトが追加されます。それ以外の場合は、ゼロを返し、スタックを変更しません。funcによって返されたすべての値は破棄されます。narr個の配列要素とnrec個の非配列要素用に事前割り当てられたスペースがあります。この事前割り当ては、テーブルが持つ要素の数を正確に知っている場合に役立ちます。それ以外の場合は、関数lua_newtableを使用できます(lua_newtable()を参照)。lua_dumpは指定されたdataを使用して関数writer(lua_Writerを参照)を呼び出してそれらを書き込みます。index1とindex2にある2つの値が、Luaの==演算子のセマンティクス(つまり、メタメソッドを呼び出す可能性がある)に従って等しい場合は1を返します。それ以外の場合は0を返します。また、いずれかのインデックスが無効な場合は0を返します。whatの値に応じて、いくつかのタスクを実行します。LUA_GCSTOP はガベージコレクタを停止します。LUA_GCRESTART はガベージコレクタを再起動します。LUA_GCCOLLECT は完全なガベージコレクションサイクルを実行します。LUA_GCCOUNT は、Luaが使用している現在のメモリ量(キロバイト単位)を返します。LUA_GCCOUNTB は、Luaが使用している現在のメモリ量(バイト単位)を1024で割った余りを返します。LUA_GCSTEP は、ガベージコレクションの増分ステップを実行します。ステップの「サイズ」はdataによって(明示されない方法で)制御されます(大きい値はより多くのステップを意味します)。ステップサイズを制御したい場合は、dataの値を実験的に調整する必要があります。関数は、ステップがガベージコレクションサイクルを完了した場合は1を返します。t[k]をプッシュします。ここで、tは、指定された有効なインデックスindexの値です。Luaと同様に、この関数は「インデックス」イベントのメタメソッドをトリガーする可能性があります(lua-metatableを参照)。nameの値をスタックにプッシュします。これはマクロとして定義されています。#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)
t[k]をプッシュします。ここで、tは指定された有効なインデックスindexの値で、kはスタックの最上位にある値です。ptrdiff_tです。これは通常、マシンが「快適に」処理する最大の整数型です。nilの場合は1を、それ以外の場合は0を返します。index1の値が、Luaの<演算子のセマンティクスに従って(つまり、メタメソッドを呼び出す可能性がある)、許容可能なインデックスindex2の値よりも小さい場合は1を返します。それ以外の場合は0を返します。また、いずれかのインデックスが無効な場合は0を返します。int lua_load (lua_State *L,
lua_Reader reader,
void *data,
const char *chunkname);
lua_loadはコンパイルされたチャンクをLua関数としてスタックの最上位にプッシュします。それ以外の場合は、エラーメッセージをプッシュします。lua_loadの戻り値は次のとおりです。0:エラーなし;LUA_ERRSYNTAX:プリコンパイル中の構文エラー;LUA_ERRMEM:メモリ割り当てエラー。lua_loadは、チャンクがテキストかバイナリかを自動的に検出し、それに応じてロードします(プログラムluacを参照)。chunkname引数は、エラーメッセージやデバッグ情報で使用されるチャンクに名前を付けます(lua-apiDebugを参照)。NULLを返します。引数fはアロケータ関数です。Luaはこの状態のすべてのメモリアロケーションをこの関数を通して行います。2番目の引数udは不透明なポインタであり、Luaはすべての呼び出しでアロケータに渡すだけです。lua_createtable(L, 0, 0)(lua_createtable()を参照)と同等です。lua_State(lua_Stateを参照)へのポインタを返します。この関数によって返される新しい状態は、グローバルオブジェクト(テーブルなど)を元の状態と共有しますが、独立した実行スタックを持ちます。gcメタメソッドを持つフルユーザデータをコレクションすると、Luaはメタメソッドを呼び出し、ユーザデータをファイナライズ済みとしてマークします。このユーザデータが再度コレクションされると、Luaはその対応するメモリを解放します。lua_nextは0を返し(何もプッシュしません)。/* 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_tolstring(lua_tolstring()を参照)を呼び出さないでください。lua_tolstringは指定されたインデックスの値を変更することを思い出してください。これはlua_nextの次の呼び出しを混乱させます。luaconf.hで変更できます。#)の結果、userdataの場合はuserdataに割り当てられたメモリブロックのサイズ、その他の値の場合は0です。nargsとnresultsの両方は、lua_call(lua_call()を参照)と同じ意味を持ちます。呼び出し中にエラーがない場合、lua_pcallはlua_callとまったく同じように動作します。ただし、エラーがある場合、lua_pcallはそれをキャッチし、スタックに単一の値(エラーメッセージ)をプッシュし、エラーコードを返します。lua_callと同様に、lua_pcallは常にスタックから関数とその引数を削除します。errfuncが0の場合、スタックに返されるエラーメッセージは元のエラーメッセージとまったく同じです。それ以外の場合、errfuncはerror ハンドラ関数のスタックインデックスです。(現在の実装では、このインデックスは擬似インデックスにはできません。)実行時エラーの場合、この関数はエラーメッセージとともに呼び出され、その戻り値はlua_pcallによってスタックに返されるメッセージになります。lua_pcallの戻り後には収集できません。その時点までにスタックが巻き戻されるためです。lua_pcall関数は、成功した場合は0を返し、次のエラーコード(lua.hで定義)のいずれかを返します。LUA_ERRRUN ランタイムエラー。LUA_ERRMEM メモリ割り当てエラー。このようなエラーの場合、Luaはエラーハンドラ関数を呼び出しません。LUA_ERRERR エラーハンドラ関数の実行中のエラー。n個の要素をポップします。bを持つブール値をスタックにプッシュします。lua_pushcclosureを呼び出して、C関数を作成してスタックにプッシュします。引数nは、関数に関連付ける必要がある値の数を伝えます。lua_pushcclosureは、これらの値もスタックからポップします。function型のLua値をスタックにプッシュします。lua_pushcfunctionはマクロとして定義されています#define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)
sprintfに似ていますが、いくつかの重要な違いがあります。%%(文字列に%を挿入)、%s(サイズ制限なしで、ゼロ終端文字列を挿入)、%f(lua_Numberを挿入)、%p(ポインタを16進数で挿入)、%d(intを挿入)、および%c(intを文字として挿入)のみです。nを持つ数値をスタックにプッシュします。lenでsが指す文字列をスタックにプッシュします。Luaは与えられた文字列の内部コピーを作成(または再利用)するため、関数が返った直後にsのメモリを解放または再利用できます。文字列には埋め込まれたゼロを含めることができます。nを持つ数値をスタックにプッシュします。sが指すゼロ終端文字列をスタックにプッシュします。Luaは与えられた文字列の内部コピーを作成(または再利用)するため、関数が返った直後にsのメモリを解放または再利用できます。文字列に埋め込まれたゼロを含めることはできません。最初のゼロで終了すると想定されています。Lで表されるスレッドをスタックにプッシュします。このスレッドがその状態のメインスレッドである場合は1を返します。const char *lua_pushvfstring (lua_State *L,
const char *fmt,
va_list argp);
index1とindex2の2つの値が(メタメソッドを呼び出さずに)原始的に等しい場合は1を返します。それ以外の場合は0を返します。インデックスのいずれかが無効な場合も0を返します。lua_gettable(lua_gettable()を参照)と似ていますが、生のアクセス(つまり、メタメソッドなし)を行います。t[n]をプッシュします。ここで、tは指定された有効なインデックスindexの値です。アクセスは生です。つまり、メタメソッドを呼び出しません。lua_settable(lua_settable()を参照)と似ていますが、生の代入(つまり、メタメソッドなし)を行います。t[n] = vと同等の処理を行います。ここで、tは指定された有効なインデックスindexの値であり、vはスタックの最上部の値です。lua_load(lua_load()を参照)で使用されるリーダー関数。lua_loadは、チャンクの別の部分が必要になるたびに、リーダーを呼び出し、そのdataパラメータを渡します。リーダーは、チャンクの新しい部分を含むメモリブロックへのポインタを返し、sizeをブロックサイズに設定する必要があります。ブロックは、リーダー関数が再度呼び出されるまで存在する必要があります。チャンクの終わりを通知するには、リーダーはNULLを返す必要があります。リーダー関数は、ゼロより大きい任意のサイズのチャンクを返すことができます。fをグローバルnameの新しい値として設定します。これはマクロとして定義されています#define lua_register(L,n,f) \
(lua_pushcfunction(L, f), lua_setglobal(L, n))
nargが引数の数であるlua_resume(lua_resume()を参照)を呼び出します。この呼び出しは、コルーチンが中断または実行を終了すると返ります。返るとき、スタックにはlua_yield(lua_yield()を参照)に渡されたすべての値、または本体関数によって返されたすべての値が含まれます。lua_resumeは、コルーチンが中断した場合はLUA_YIELDを返し、コルーチンがエラーなしで実行を終了した場合は0を返し、エラーの場合はエラーコードを返します(lua_pcall()を参照)。エラーの場合、スタックは巻き戻されないため、その上でデバッグAPIを使用できます。エラーメッセージはスタックの一番上にあります。コルーチンを再開するには、lua_yieldからの結果として渡す値をそのスタックに配置し、lua_resumeを呼び出します。udを持つfに変更します。lua_setfenv は 0 を返します。それ以外の場合は 1 を返します。t[k] = v と同等の処理を行います。ここで、t は指定された有効なインデックス index にある値、v はスタックの最上位にある値です。name の新しい値として設定します。これはマクロとして定義されています。#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, s)
t[k] = v と同等の処理を行います。ここで、t は指定された有効なインデックス index にある値、v はスタックの最上位にある値、k は最上位のすぐ下にある値です。nil で埋められます。index が 0 の場合、すべてのスタック要素が削除されます。lua_newstate(lua_newstate()を参照)は例外で、これは Lua の状態をゼロから作成します。L のステータスを返します。LUA_YIELD になります。lua_toboolean は false および nil 以外の Lua の値に対して 1 を返します。それ以外の場合は 0 を返します。また、無効なインデックスで呼び出された場合も 0 を返します。(実際のブール値のみを受け入れたい場合は、lua_isboolean lua_isboolean() を使用して値の型をテストしてください。)NULL を返します。lua_Integer に変換します(lua_Integerを参照)。Lua の値は、数値または数値に変換可能な文字列である必要があります(lua-coercionを参照)。それ以外の場合、lua_tointeger は 0 を返します。len が NULL でない場合は、*len に文字列の長さも設定します。Lua の値は、文字列または数値である必要があります。それ以外の場合、関数は NULL を返します。値が数値の場合、lua_tolstring はスタック内の実際の値を文字列に変更します。(この変更は、テーブルのトラバーサル中にキーに lua_tolstring が適用された場合に lua_next lua_next() を混乱させます。)lua_tolstring は、Lua 状態内の文字列への完全アラインメントされたポインタを返します。この文字列は常に、最後の文字の後にゼロ (\0) がありますが (C の場合と同様)、本体に他のゼロが含まれる場合があります。Lua にはガベージコレクションがあるため、lua_tolstring によって返されるポインタが、対応する値がスタックから削除された後も有効であるという保証はありません。lua_Number に変換します(lua_Numberを参照)。Lua の値は、数値または数値に変換可能な文字列である必要があります(lua-coercionを参照)。それ以外の場合、lua_tonumber は 0 を返します。void*) に変換します。値は、ユーザーデータ、テーブル、スレッド、または関数である場合があります。それ以外の場合、lua_topointer は NULL を返します。異なるオブジェクトは異なるポインタを提供します。ポインタを元の値に戻す方法はありません。lua_State* lua_Stateとして表現)に変換します。この値はスレッドである必要があります。それ以外の場合、関数は NULL を返します。NULL を返します。LUA_TNONE を返します。lua_type によって返される型は、lua.h で定義されている次の定数によってコード化されます:LUA_TNIL、LUA_TNUMBER、LUA_TBOOLEAN、LUA_TSTRING、LUA_TTABLE、LUA_TFUNCTION、LUA_TUSERDATA、LUA_TTHREAD、および LUA_TLIGHTUSERDATA。tp でエンコードされた型の名前を返します。tp は lua_type によって返された値のいずれかである必要があります。lua_dump(lua_dump()を参照)によって使用されるライター関数。lua_dump は、チャンクの別の部分を生成するたびに、書き込むバッファ(p)、そのサイズ(sz)、および lua_dump に渡された data パラメータを渡して、ライターを呼び出します。lua_dump がライターを再度呼び出すのを停止します。同じグローバル状態の異なるスレッド間で値を交換します。from スタックから n 個の値をポップし、それらを to スタックにプッシュします。return lua_yield (L, nresults);
lua_yield を呼び出すと、実行中のコルーチンはその実行を中断し、このコルーチンを開始した lua_resume(lua_resume()を参照)への呼び出しが返されます。パラメータ nresults は、lua_resume に結果として渡されるスタックからの値の数です。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*
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_getstack(lua_getstack()を参照)は、後で使用するために、この構造体のプライベート部分のみを埋めます。lua_Debug の他のフィールドに役立つ情報を入力するには、lua_getinfo(lua_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 関数は、関数がどのように呼び出されたかを調べて適切な名前を見つけます。名前が見つからない場合、name は NULL に設定されます。namewhat name フィールドを説明します。namewhat の値は、関数がどのように呼び出されたかに応じて、"global"、"local"、"method"、"field"、"upvalue"、または ""(空の文字列)になります。(Lua は、他のオプションが適用できないと思われる場合に空の文字列を使用します。)nups 関数のアップバリューの数。ar は、以前の lua_getstack(lua_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 を返します。ar は、以前に lua_getstack(lua_getstack() を参照)の呼び出しによって埋められた有効なアクティベーションレコード、またはフックへの引数として与えられたものである必要があります(lua_Hook を参照)。インデックス n は、どのローカル変数を検査するかを選択します(1 は最初のパラメータまたはアクティブなローカル変数であり、以降、最後にアクティブなローカル変数まで続きます)。lua_getlocal は変数の値をスタックにプッシュし、その名前を返します。( (開き括弧) で始まる変数名は、内部変数(ループ制御変数、一時変数、C 関数のローカル変数)を表します。NULL を返します(何もプッシュしません)。アクティベーションレコード の識別情報で lua_Debug(lua_Debug を参照)構造体の一部を埋めます。レベル 0 は現在実行中の関数であり、レベル n+1 はレベル n を呼び出した関数です。エラーがない場合は、lua_getstack は 1 を返します。スタックの深さよりも大きいレベルで呼び出された場合は、0 を返します。lua_getupvalue はアップバリューのインデックス n を取得し、アップバリューの値をスタックにプッシュし、その名前を返します。funcindex はスタック内のクロージャを指します。(アップバリューは関数全体でアクティブであるため、特定の順序を持ちません。そのため、任意の順序で番号が付けられます。)NULL を返します(何もプッシュしません)。C 関数の場合、この関数はすべてのアップバリューの名前として空文字列 "" を使用します。ar 引数の event フィールドには、フックをトリガーした特定のイベントが設定されます。Lua はこれらのイベントを次の定数で識別します: LUA_HOOKCALL, LUA_HOOKRET, LUA_HOOKTAILRET, LUA_HOOKLINE, および LUA_HOOKCOUNT。さらに、行イベントの場合、currentline フィールドも設定されます。ar 内の他のフィールドの値を取得するには、フックは lua_getinfo(lua_getinfo() を参照)を呼び出す必要があります。return イベントの場合、event は通常の値である LUA_HOOKRET であるか、LUA_HOOKTAILRET である可能性があります。後者の場合、Lua は末尾呼び出しを行った関数からの戻りをシミュレートしています。この場合、lua_getinfo を呼び出すことは無意味です。f はフック関数です。mask は、フックが呼び出されるイベントを指定します。これは、定数 LUA_MASKCALL, LUA_MASKRET, LUA_MASKLINE, および LUA_MASKCOUNT のビット単位の or によって形成されます。count 引数は、マスクに LUA_MASKCOUNT が含まれている場合にのみ意味があります。各イベントについて、フックは以下のように呼び出されます。コールフック: インタプリタが関数を呼び出すときに呼び出されます。フックは、Lua が新しい関数に入った直後、関数が引数を受け取る前に呼び出されます。リターンフック: インタプリタが関数から戻るときに呼び出されます。フックは、Lua が関数を離れる直前に呼び出されます。関数によって返される値にアクセスすることはできません。行フック: インタプリタが新しいコード行の実行を開始しようとしているとき、またはコード内で(同じ行にでも)ジャンプバックするときに呼び出されます。(このイベントは、Lua が Lua 関数を実行している間のみ発生します。)カウントフック: インタプリタが count 命令を実行するたびに呼び出されます。(このイベントは、Lua が Lua 関数を実行している間のみ発生します。)mask をゼロに設定すると、フックは無効になります。ar と n は、lua_getlocal(lua_getlocal() を参照)と同じです。lua_setlocal はスタックの最上位にある値を変数に割り当て、その名前を返します。また、スタックから値をポップします。NULL を返します(何もポップしません)。funcindex と n は、lua_getupvalue(lua_getupvalue() を参照)と同じです。NULL を返します(何もポップしません)。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;
}
lauxlib.h で定義されており、接頭辞 luaL_ が付いています。luaL_check* または luaL_opt* です。これらの関数はすべて、チェックが満たされない場合にエラーを発生させます。エラーメッセージは引数用にフォーマットされている(例: "bad argument #1")ため、これらの関数を他のスタック値に使用しないでください。B に追加します(luaL_Buffer を参照)。値をポップします。void luaL_argcheck (lua_State *L,
int cond,
int narg,
const char *extramsg);
cond が true かどうかを確認します。そうでない場合は、次のメッセージでエラーを発生させます。ここで、func はコールスタックから取得されます。bad argument #<narg> to <func> (<extramsg>)
func はコールスタックから取得されます。bad argument #<narg> to <func> (<extramsg>)
return luaL_argerror( args ) として使用するのが慣例です。文字列バッファ の型です。luaL_Buffer 型の変数 b を宣言します。luaL_buffinit(L, &b) を呼び出して初期化します(luaL_buffinit() を参照)。luaL_add* 関数のいずれかを呼び出して、文字列の断片をバッファに追加します。luaL_pushresult(&b) を呼び出して終了します(luaL_pushresult() を参照)。この呼び出しは、最終的な文字列をスタックの最上位に残します。luaL_addvalue luaL_addvalue()です。)luaL_pushresultを呼び出した後、スタックはバッファが初期化されたときのレベルに戻り、その上に最終的な文字列が乗っています。Bを初期化します。この関数はスペースを割り当てません。バッファは変数として宣言する必要があります(luaL_Bufferを参照)。objにあるオブジェクトがメタテーブルを持ち、このメタテーブルがフィールドeを持つ場合、この関数はこのフィールドを呼び出し、オブジェクトを唯一の引数として渡します。この場合、この関数は1を返し、呼び出しによって返された値をスタックにプッシュします。メタテーブルがない場合、またはメタメソッドがない場合、この関数は0を返します(スタックに値をプッシュせずに)。nargに任意の型(nilを含む)の引数を持っているかどうかをチェックします。nargが数値であるかどうかをチェックし、この数値をintにキャストして返します。nargが数値であるかどうかをチェックし、この数値をlongにキャストして返します。const char *luaL_checklstring (lua_State *L, int narg, size_t *l);
nargが文字列であるかどうかをチェックし、この文字列を返します。lがNULLでない場合は、*lに文字列の長さを格納します。nargが数値であるかどうかをチェックし、この数値を返します(lua_Numberを参照)。int luaL_checkoption (lua_State *L,
int narg,
const char *def,
const char *const lst[]);
nargが文字列であるかどうかをチェックし、この文字列を配列lst(NULL終端である必要があります)で検索します。文字列が見つかった配列内のインデックスを返します。引数が文字列でない場合、または文字列が見つからない場合は、エラーを発生させます。defがNULLでない場合、関数は引数nargがない場合、またはこの引数がnilである場合、デフォルト値としてdefを使用します。top + sz要素に拡張し、そのサイズまでスタックを拡張できない場合はエラーを発生させます。msgは、エラーメッセージに入れる追加のテキストです。nargが文字列であるかどうかをチェックし、この文字列を返します。void *luaL_checkudata (lua_State *L, int narg, const char *tname);
(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
(luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
fmtと、lua_pushfstringと同じルールに従う追加の引数によって与えられます(lua_pushfstring()を参照)。また、メッセージの先頭に、エラーが発生したファイル名と行番号を追加します(この情報が利用可能な場合)。return luaL_error( args )として使用するのが慣例です。objにあるオブジェクトのメタテーブルからフィールドeをスタックにプッシュします。オブジェクトがメタテーブルを持たない場合、またはメタテーブルにこのフィールドがない場合は、0を返し、何もプッシュしません。tnameに関連付けられたメタテーブルをスタックにプッシュします(luaL_newmetatable()を参照)。const char *luaL_gsub (lua_State *L,
const char *s,
const char *p,
const char *r);
sのコピーを作成し、文字列pのすべての出現箇所を文字列rで置換します。結果の文字列をスタックにプッシュして返します。int luaL_loadbuffer (lua_State *L,
const char *buff,
size_t sz,
const char *name);
lua_loadと同じ結果を返します。nameはチャンク名であり、デバッグ情報およびエラーメッセージに使用されます。lua_load(lua_load()を参照)を使用して、ファイル名filenameのファイル内のチャンクをロードします。filenameがNULLの場合、標準入力からロードします。ファイル内の最初の行が#で始まる場合は無視されます。lua_loadと同じ結果を返しますが、ファイルを開いて読み取ることができない場合は、追加のエラーコードLUA_ERRFILEがあります。lua_loadと同様に、この関数はチャンクをロードするだけで、実行はしません。lua_loadと同じ結果を返します。lua_loadと同様に、この関数はチャンクをロードするだけで、実行はしません。tnameがある場合は、0を返します。それ以外の場合は、userdataのメタテーブルとして使用する新しいテーブルを作成し、キーtnameでレジストリに追加して、1を返します。tnameに関連付けられた最終値をスタックにプッシュします。realloc関数に基づいたアロケータを使用してlua_newstate(lua_newstate()を参照)を呼び出し、致命的なエラーが発生した場合に標準エラー出力にエラーメッセージを出力するパニック関数(lua_atpanic()を参照)を設定します。NULLを返します。nargが数値の場合、この数値をintにキャストして返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。lua_Integer luaL_optinteger (lua_State *L,
int narg,
lua_Integer d);
nargが数値の場合、この数値をlua_Integer(lua_Integerを参照)にキャストして返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。nargが数値の場合、この数値をlongにキャストして返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。const char *luaL_optlstring (lua_State *L,
int narg,
const char *d,
size_t *l);
nargが文字列の場合、この文字列を返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。lがNULLでない場合は、位置*lに結果の長さを格納します。nargが数値の場合、この数値を返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。nargが文字列の場合、この文字列を返します。この引数がない場合、またはnilの場合は、dを返します。それ以外の場合は、エラーを発生させます。B(luaL_Bufferを参照)に追加する文字列をコピーできる、サイズがLUAL_BUFFERSIZEの領域へのアドレスを返します。この領域に文字列をコピーした後、文字列を実際にバッファに追加するために、文字列のサイズを指定してluaL_addsize(luaL_addsize()を参照)を呼び出す必要があります。Bの使用を終了し、最終的な文字列をスタックのトップに残します。tのテーブル内にreferenceを作成して返します(そしてオブジェクトをポップします)。tに整数キーを手動で追加しない限り、luaL_refは返すキーの一意性を保証します。参照rによって参照されるオブジェクトは、lua_rawgeti(L, t, r)(lua_rawgeti()を参照)を呼び出すことで取得できます。関数luaL_unref(luaL_unref()を参照)は、参照とそれに関連付けられたオブジェクトを解放します。nilの場合、luaL_refは定数LUA_REFNILを返します。定数LUA_NOREFは、luaL_refによって返されるどの参照とも異なることが保証されています。luaL_register(luaL_register()を参照)によって登録される関数の配列の型。nameは関数名で、funcは関数へのポインタです。luaL_Regの配列は、nameとfuncの両方がNULLである番兵エントリで終わる必要があります。void luaL_register (lua_State *L,
const char *libname,
const luaL_Reg *l);
libnameで呼び出された場合、luaL_registerは新しいテーブルtを作成し、それをグローバル変数libnameの値として設定し、それをpackage.loaded[libname]の値として設定し、リストl内のすべての関数をそこに登録します。package.loaded[libname]または変数libnameにテーブルがある場合、新しいテーブルを作成する代わりに、このテーブルを再利用します。idxにある値の型名を返します。location : bad argument narg to 'func' ( tname expected, got rt )tのテーブルから参照refを解放します(luaL_ref()を参照)。エントリはテーブルから削除され、参照されているオブジェクトは収集できるようになります。参照refも解放され、再利用できるようになります。refがLUA_NOREFまたはLUA_REFNILの場合、luaL_unrefは何も行いません。lvlにおける現在のコントロールの位置を識別する文字列をスタックにプッシュします。通常、この文字列は次の形式になります。chunkname:currentline
typeやgetmetatable)を提供します。他の関数は「外部」サービス(例えば、I/O)へのアクセスを提供します。また、他の関数は Lua 自体で実装できますが、非常に便利であるか、C での実装に値する重要なパフォーマンス要件があります(例えば、sort)。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_call(lua_call()を参照)を使用して呼び出す必要があります。{v} [, {message}]) assert()vの値がfalse(つまり、nilまたはfalse)の場合にエラーを発行します。それ以外の場合は、すべての引数を返します。messageはエラーメッセージです。省略すると、デフォルトで「assertion failed!」になります。{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を参照)。{filename}) dofile()dofileは標準入力(stdin)の内容を実行します。チャンクによって返されたすべての値を返します。エラーが発生した場合、dofileはその呼び出し元にエラーを伝播します(つまり、dofileは保護モードで実行されません)。{error}はメッセージの先頭にエラー位置に関する情報をいくつか追加します。引数{level}は、エラー位置を取得する方法を指定します。レベル1(デフォルト)の場合、エラー位置は{error}関数が呼び出された場所です。レベル2は、{error}を呼び出した関数が呼び出された場所を指します。などです。レベル0を渡すと、メッセージへのエラー位置情報の追加を回避できます。_G._G = _G)を保持するグローバル変数(関数ではありません)。Lua自体はこの変数を使用しません。その値を変更しても、どの環境にも影響しませんし、その逆も同様です。(環境を変更するにはsetfenvを使用します。){f}) getfenv(){f}は、Lua 関数、またはそのスタックレベルの関数を指定する数値にすることができます。レベル1は、getfenvを呼び出す関数です。指定された関数が Lua 関数でない場合、または{f}が0の場合、getfenvはグローバル環境を返します。{f}のデフォルトは1です。{object}) getmetatable(){object}にメタテーブルがない場合は、nilを返します。それ以外の場合は、オブジェクトのメタテーブルに"__metatable"フィールドがある場合、関連付けられた値を返します。それ以外の場合は、指定されたオブジェクトのメタテーブルを返します。for i,v in ipairs(t) do body end1,t[1])、(2,t[2])、... を反復処理します。{func} [, {chunkname}]) load(){func}を使用します。{func}への各呼び出しは、前の結果と連結される文字列を返す必要があります。nil(または値がない場合)を返すと、チャンクの終わりを示します。nilとエラーメッセージを返します。返される関数の環境は、グローバル環境です。{chunkname}は、エラーメッセージとデバッグ情報のためのチャンク名として使用されます。{filename}]) loadfile()load(load()を参照)と同様ですが、チャンクをファイル{filename}から取得します。ファイル名が指定されていない場合は、標準入力から取得します。assert(loadstring(s))()
{table} [, {index}]) next()nextは、テーブルの次のインデックスとそれに関連付けられた値を返します。2番目の引数としてnilを指定して呼び出すと、nextは最初のインデックスとそれに関連付けられた値を返します。最後のインデックス、または空のテーブルでnilを指定して呼び出すと、nextはnilを返します。2番目の引数がない場合は、nilとして解釈されます。特に、テーブルが空かどうかを確認するためにnext(t)を使用できます。forまたはipairs()関数を使用してください。)nextの動作は未定義です。ただし、既存のフィールドは変更できます。特に、既存のフィールドをクリアできます。for k,v in pairs(t) do body end{t}のすべてのキーと値のペアを反復処理します。{f}, {arg1}, {...}) pcall(){f}を保護モードで呼び出します。これは、{f}内部のエラーが伝播されないことを意味します。代わりに、pcallはエラーをキャッチし、ステータスコードを返します。最初の結果はステータスコード(ブール値)であり、呼び出しがエラーなしで成功した場合はtrueになります。その場合、pcallは、この最初の結果の後に、呼び出しからのすべての結果も返します。エラーが発生した場合、pcallはfalseとエラーメッセージを返します。{...}) print()stdoutに出力します。その際、tostringtostring()関数を使用して文字列に変換します。printは、フォーマットされた出力用ではなく、値をすばやく表示するためのものです(通常はデバッグ用)。フォーマットされた出力の場合は、string.format(string.format()を参照)を使用してください。{table}, {index}) rawget()table[index]の実際の値を取得します。{table}はテーブルである必要があります。{index}は任意の値にできます。{table}, {index}, {value}) rawset()table[index]の実際の値を{value}に設定します。{table}はテーブルである必要があり、{index}はnil以外の任意の値、{value}は任意のLua値である必要があります。{table}を返します。{index}, {...}) select(){index}が数値の場合、引数番号{index}より後のすべての引数を返します。それ以外の場合、{index}は文字列"#"である必要があり、selectは受け取った追加の引数の合計数を返します。{f}, {table}) setfenv(){f}は、Lua関数、またはそのスタックレベルで関数を指定する数値にすることができます。レベル1は、setfenvを呼び出す関数です。setfenvは、指定された関数を返します。{f}が0の場合、setfenvは実行中のスレッドの環境を変更します。この場合、setfenvは値を返しません。{table}, {metatable}) setmetatable(){metatable}がnilの場合、指定されたテーブルのメタテーブルを削除します。元のメタテーブルに"__metatable"フィールドがある場合は、エラーが発生します。{table}を返します。{e} [, {base}]) tonumber()tonumberはこの数値を返します。それ以外の場合は、nilを返します。A(大文字または小文字)は10、Bは11、以下同様に、Zは35を表します。基数10(デフォルト)では、数値は10進数部分と、オプションの指数部分を持つことができます(lua-lexicalを参照)。他の基数では、符号なし整数のみが受け入れられます。{e}) tostring()string.format(string.format()を参照)を使用してください。{v}) lua-type()"nil"(値nilではなく文字列)、"number"、"string"、"boolean、"table"、"function"、"thread"、および"userdata"です。{list} [, {i} [, {j}]]) unpack()return list[i], list[i+1], ..., list[j]
xpcallは、{err}をエラーハンドラーとして使用して、保護モードで関数{f}を呼び出します。{f}内のエラーは伝播されません。代わりに、xpcallはエラーをキャッチし、元のエラーオブジェクトで{err}関数を呼び出し、ステータスコードを返します。最初の結果はステータスコード(ブール値)であり、呼び出しがエラーなしで成功した場合はtrueになります。この場合、xpcallは、この最初の結果の後に、呼び出しからのすべての結果も返します。エラーが発生した場合、xpcallはfalseと{err}からの結果を返します。coroutineテーブル内にあります。コルーチンの一般的な説明については、lua-coroutineを参照してください。{f}) coroutine.create(){f}を持つ新しいコルーチンを作成します。{f}はLua関数である必要があります。この新しいコルーチン、型"thread"のオブジェクトを返します。{co} [, {val1}, {...}]) coroutine.resume(){co}の実行を開始または継続します。コルーチンを初めて再開すると、本体の実行が開始されます。値{val1}、{...}は、本体関数への引数として渡されます。コルーチンが中断されている場合、resumeはコルーチンを再開します。値{val1}、{...}は、yieldからの結果として渡されます。resumeは、yieldに渡された値(コルーチンがyieldする場合)または本体関数によって返された値(コルーチンが終了する場合)に加えて、trueを返します。エラーがある場合、resumeはfalseとエラーメッセージを返します。{co}) coroutine.status(){co}の状態を文字列として返します。コルーチンが実行中の場合(つまり、statusを呼び出した場合)は"running"、コルーチンがyieldの呼び出しで中断されている場合、またはまだ実行が開始されていない場合は"suspended"、コルーチンがアクティブであるが実行中でない場合(つまり、別のコルーチンを再開した場合)は"normal"、コルーチンが本体関数を完了した場合、またはエラーで停止した場合は"dead"を返します。{f}) coroutine.wrap(){f}を持つ新しいコルーチンを作成します。{f}はLua関数である必要があります。呼び出されるたびにコルーチンを再開する関数を返します。関数に渡された引数はすべて、resumeへの追加の引数として動作します。最初のブール値を除いて、resumeによって返される同じ値を返します。エラーの場合、エラーを伝播します。{...}) coroutine.yield()yieldへの引数はすべて、resumeへの追加の結果として渡されます。requireとmoduleです(require()とmodule()を参照)。その他はすべてpackageテーブルでエクスポートされます。{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 を受け取ることができます。各オプションは、モジュールに適用される関数です。{modname}) require()package.loaded テーブルを調べて、{modname} が既にロードされているかどうかを判断します。ロードされている場合は、require は package.loaded[modname] に格納されている値を返します。それ以外の場合は、モジュールの loader を見つけようとします。require は package.preload[modname] を照会します。値がある場合、この値 (関数である必要があります) がローダーになります。それ以外の場合、require は package.path に格納されているパスを使用して Lua ローダーを検索します。それでも失敗する場合は、package.cpath に格納されているパスを使用して C ローダーを検索します。それでも失敗する場合は、all-in-one ローダーを試します (下記参照)。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 を割り当てます。いずれの場合も、require は package.loaded[modname] の最終的な値を返します。require はエラーを通知します。LUA_CPATH (および luaconf.h で定義された別のデフォルトパス) を使用して、Lua パス package.path を初期化するのと同じ方法で、C パス package.cpath を初期化します。require が使用するテーブル。モジュール modname を require するときに、package.loaded[modname] が false でない場合、require はそこに格納されている値を単純に返します。{libname}, {funcname}) package.loadlib(){libname} と動的にリンクします。このライブラリ内で、関数 {funcname} を検索し、この関数を C 関数として返します。(したがって、{funcname} はプロトコル ( lua_CFunction を参照) に従う必要があります)。require とは異なり、パス検索は実行せず、拡張機能は自動的に追加しません。{libname} は、必要に応じてパスと拡張子を含む、C ライブラリの完全なファイル名である必要があります。{funcname} は、C ライブラリによってエクスポートされた正確な名前である必要があります (使用される C コンパイラとリンカーによって異なる場合があります)。dlfcn 標準をサポートするその他の Unix システム) でのみ利用可能です。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 をこの順序でロードしようとします。{module}) package.seeall()__index フィールドを使用して {module} のメタテーブルを設定します。関数 {module} のオプションとして使用します。string 内に提供します。また、__index フィールドが string テーブルを指す文字列のメタテーブルを設定します。したがって、オブジェクト指向スタイルで文字列関数を使用できます。たとえば、string.byte(s, i) は s:byte(i) と記述できます。{s} [, {i} [, {j}]]) string.byte()s[i]、s[i+1]、...、s[j] の内部数値コードを返します。{i} のデフォルト値は 1 です。{j} のデフォルト値は {i} です。{function}) string.dump(){function} はアップバリューのない Lua 関数である必要があります。{s}, {pattern} [, {init} [, {plain}]]) string.find(){s} 内の {pattern} の最初のマッチを検索します。一致が見つかった場合、{find} はこの出現箇所が開始および終了する {s} のインデックスを返します。それ以外の場合は、nil を返します。3 番目のオプションの数値引数 {init} は、検索を開始する場所を指定します。そのデフォルト値は 1 で、負の値になる可能性があります。4 番目のオプションの引数 {plain} として {true} の値を指定すると、パターンマッチング機能が無効になり、関数は単純な「部分文字列検索」操作を実行します。{pattern} 内の文字は「マジック」と見なされません。{plain} が指定されている場合は、{init} も指定する必要があることに注意してください。{formatstring}, {...}) string.format()printf ファミリと同じルールに従います。唯一の違いは、オプション/修飾子 *、l、L、n、p、および h がサポートされておらず、追加のオプション q があることです。q オプションは、Lua インタープリタによって安全に読み戻せる形式で文字列をフォーマットします。文字列は二重引用符で囲んで記述され、文字列内のすべての二重引用符、改行、埋め込まれたゼロ、およびバックスラッシュは、書き込まれるときに正しくエスケープされます。たとえば、呼び出しstring.format('%q', 'a string with "quotes" and \n new line')
"a string with \"quotes\" and \
new line"
c、d、E、e、f、g、G、i、o、u、X、および x はすべて引数として数値を予期しますが、q と s は文字列を予期します。{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
{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"
{s}) string.len()"" の長さは 0 です。埋め込まれたゼロもカウントされるため、"a\000b\000c" の長さは 5 です。{s}) string.lower(){s}, {pattern} [, {init}]) string.match(){s} 内で最初に {pattern} に一致するものを探します。一致するものが見つかった場合、match はパターンからのキャプチャを返します。それ以外の場合は nil を返します。{pattern} がキャプチャを指定しない場合、一致全体が返されます。3番目のオプションの数値引数 {init} は、検索を開始する場所を指定します。デフォルト値は 1 で、負の値でも構いません。{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} の接尾辞を返します。{s}) string.upper()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 と同等ではない場合があります。* が続く単一の文字クラス。これは、クラス内の文字の 0 回以上の繰り返しに一致します。これらの繰り返し項目は、常に可能な限り最長のシーケンスに一致します。+ が続く単一の文字クラス。これは、クラス内の文字の 1 回以上の繰り返しに一致します。これらの繰り返し項目は、常に可能な限り最長のシーケンスに一致します。- が続く単一の文字クラス。これは、クラス内の文字の 0 回以上の繰り返しにも一致します。* とは異なり、これらの繰り返し項目は常に可能な限り最短のシーケンスに一致します。? が続く単一の文字クラス。これは、クラス内の文字の 0 回または 1 回の出現に一致します。%n (n は 1 から 9 の間)。このような項目は、n 番目にキャプチャされた文字列と同じ部分文字列に一致します(下記参照)。%bxy。ここで、x と y は 2 つの異なる文字です。このような項目は、x で始まり、y で終わり、x と y がバランスが取れている文字列に一致します。これは、文字列を左から右に読み、x に対して +1 をカウントし、y に対して -1 をカウントすると、終端の y はカウントが 0 に達する最初の y であることを意味します。たとえば、項目 %b() は、括弧がバランスが取れた式に一致します。^ は、一致を対象文字列の先頭に固定します。パターンの末尾にある $ は、一致を対象文字列の末尾に固定します。その他の位置では、^ と $ は特別な意味を持たず、それ自体を表します。"(a*(.)%w(%s*))" では、"a*(.)%w(%s*)" に一致する文字列の部分は最初のキャプチャとして格納され(したがって、番号1になります)、. に一致する文字は番号 2 でキャプチャされ、%s* に一致する部分は番号 3 を持ちます。() は、現在の文字列位置(数値)をキャプチャします。たとえば、文字列 "flaaap" にパターン "()aa()" を適用すると、2 つのキャプチャ(3 と 5)が発生します。%z を使用してください。table 内にすべての関数を提供します。{table} [, {sep} [, {i} [, {j}]]]) table.concat()table[i]..sep..table[i+1] ... sep..table[j] を返します。{sep} のデフォルト値は空の文字列、{i} のデフォルトは 1、{j} のデフォルトはテーブルの長さです。{i} が {j} より大きい場合は、空の文字列を返します。{table}, {f}) table.foreach(){f} を {table} のすべての要素に対して実行します。要素ごとに、{f} は引数としてインデックスとそれぞれの値とともに呼び出されます。{f} が `nil` でない値を返した場合、ループが中断され、この値が table.foreach の最終値として返されます。{table}, {f}) table.foreachi(){table} の数値インデックスに対して、与えられた関数 {f} を実行します。各インデックスに対して、{f} はインデックスと対応する値を引数として呼び出されます。インデックスは、1 からテーブルの長さ `n` まで順番にアクセスされます。{f} が `nil` 以外の値を返した場合、ループは中断され、その値が `table.foreachi` の結果として返されます。{table}, [{pos},] {value}) table.insert(){table} の {pos} の位置に要素 {value} を挿入し、必要に応じて他の要素を上にシフトしてスペースを作ります。{pos} のデフォルト値は `n+1` です。ここで `n` はテーブルの長さ(lua-length を参照)です。したがって、`table.insert(t,x)` の呼び出しは、テーブル `t` の最後に `x` を挿入します。{table}) table.maxn(){table} [, {pos}]) table.remove(){table} から {pos} の位置にある要素を削除し、必要に応じて他の要素を下にシフトしてスペースを閉じます。削除された要素の値を返します。{pos} のデフォルト値は `n` です。ここで `n` はテーブルの長さ(lua-length を参照)です。したがって、`table.remove(t)` の呼び出しは、テーブル `t` の最後の要素を削除します。{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 演算子 `<` が代わりに使用されます。{x}, {y}) math.atan2()x/y の逆正接(ラジアン単位)を返しますが、両方のパラメーターの符号を使用して、結果の象限を見つけます。(また、{y} がゼロの場合も正しく処理します。){x}) math.frexp()x = m * 2^e となるような `m` と `e` を返します。e は整数であり、`m` の絶対値は範囲 `[0.5, 1)` にあります(または、{x} がゼロの場合はゼロ)。{m} [, {n}]]) math.random(){m} で呼び出された場合、`math.random` は範囲 `[1, m]` の疑似乱数整数を返します。2つの数値 {m} と {n} で呼び出された場合、`math.random` は範囲 `[m, n]` の疑似乱数整数を返します。{file}]) io.input(){filename}]) io.lines()for line in io.lines(filename) do body endio.lines() の呼び出し(ファイル名なし)は io.input():lines() と同等です。つまり、デフォルトの入力ファイルの行を反復処理します。この場合、ループが終了してもファイルは閉じられません。{filename} [, {mode}]) io.open(){mode} で指定されたモードでファイルを開きます。新しいファイルハンドルを返します。エラーの場合は、nil とエラーメッセージを返します。{mode} 文字列には、次のいずれかを指定できます。"r" 読み取りモード(デフォルト);"w" 書き込みモード;"a" 追加モード;"r+" 更新モード、以前のデータはすべて保持されます;"w+" 更新モード、以前のデータはすべて消去されます;"a+" 追加更新モード、以前のデータは保持され、書き込みはファイルの末尾のみに許可されます。{mode} 文字列の末尾に b を付けることもできます。これは、一部のシステムでファイルをバイナリモードで開くために必要です。この文字列は、標準C関数の fopen で使用されるものとまったく同じです。{prog} [, {mode}]) io.popen(){prog} を別のプロセスで開始し、このプログラムからデータを読み取る({mode} が "r" の場合、デフォルト)またはこのプログラムにデータを書き込む({mode} が "w" の場合)ために使用できるファイルハンドルを返します。{obj}) io.type(){obj} が有効なファイルハンドルかどうかを確認します。{obj} が開いているファイルハンドルの場合は文字列 "file"、{obj} が閉じているファイルハンドルの場合は "closed file" を返し、{obj} がファイルハンドルでない場合は nil を返します。file を閉じます。ファイルはハンドルがガベージコレクションされると自動的に閉じられますが、それが発生するまでに予測できない時間がかかることに注意してください。for line in file:lines() do body endio.lines とは異なり、この関数はループが終了してもファイルを閉じません。){...}) file:read()file を読み取ります。各形式について、関数は読み取られた文字を含む文字列(または数値)を返します。指定された形式でデータを読み取ることができない場合は nil を返します。形式を指定せずに呼び出された場合、次の行全体を読み取るデフォルトの形式を使用します(下記参照)。"*n" は数値を読み取ります。これは、文字列ではなく数値を返す唯一の形式です。"*a" は、現在の位置から始まるファイル全体を読み取ります。ファイルの終わりに、空の文字列を返します。"*l" は次の行を読み取ります(行末をスキップします)。ファイルの終わりに nil を返します。これがデフォルトの形式です。number は、最大でその数の文字を含む文字列を読み取ります。ファイルの終わりに nil を返します。数値がゼロの場合、何も読み取らずに空の文字列を返します。ファイルの終わりには nil を返します。{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") の呼び出しは、位置をファイルの末尾に設定し、そのサイズを返します。"no" バッファリングなし。出力操作の結果はすぐに表示されます。"full" フルバッファリング。出力操作は、バッファが満杯になったとき(または明示的にファイルの flush を実行したとき(io.flush() を参照)にのみ実行されます。 "line" 行バッファリング。出力は、改行が出力されるか、一部の特別なファイル(ターミナルデバイスなど)から入力があるまでバッファリングされます。{size} はバッファのサイズをバイト単位で指定します。デフォルトは適切なサイズです。{...}) file:write()file に書き込みます。引数は文字列または数値である必要があります。他の値を書き込むには、tostring tostring() または string.format string.format() を write の前に使用します。os を通じて実装されます。{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") と同等です)。{t2}, {t1}) os.difftime(){t1} から時間 {t2} までの秒数を返します。POSIX、Windows、およびその他のシステムでは、この値は正確に t2 - t1 です。{command}]) os.execute()system と同等です。オペレーティングシステムのシェルによって実行される {command} を渡します。システムに依存するステータスコードを返します。{command} がない場合は、シェルが使用可能な場合はゼロ以外の値を返し、それ以外の場合はゼロを返します。{code}]) os.exit(){code} を指定してC関数 exit を呼び出して、ホストプログラムを終了します。{code} のデフォルト値は成功コードです。{filename}) os.remove()nil とエラーを説明する文字列を返します。{oldname}, {newname}) os.rename(){oldname} という名前のファイルを {newname} に変更します。この関数が失敗した場合、nil とエラーを説明する文字列を返します。{locale} [, {category}]) os.setlocale(){locale} はロケールを指定する文字列です。{category} は変更するカテゴリを説明するオプションの文字列です:"all"、"collate"、"ctype"、"monetary"、"numeric"、または "time"。デフォルトのカテゴリは "all" です。関数は、新しいロケールの名前を返します。または、リクエストに応じられない場合は nil を返します。{table}]) os.time()year、month、および day のフィールドが含まれている必要があり、hour、min、sec、および isdst のフィールドが含まれている場合があります(これらのフィールドの説明については、os.date 関数 os.date() を参照)。time によって返される数値は date および difftime の引数としてのみ使用できます。debugテーブル内で提供されます。スレッドを操作するすべての関数には、操作対象のスレッドであるオプションの最初の引数があります。デフォルトは常に現在のスレッドです。contという単語のみを含む行は、この関数を終了させ、呼び出し元が実行を続行します。debug.debugのコマンドは、どの関数にも字句的にネストされていないため、ローカル変数に直接アクセスできないことに注意してください。{thread}]) debug.gethook()debug.sethook関数によって設定されたもの)。{thread},] {function} [, {what}]) debug.getinfo(){function}の値として数値を指定することもできます。これは、指定されたスレッドのコールスタックのレベル{function}で実行されている関数を意味します。レベル0は現在の関数(getinfo自体)、レベル1はgetinfoを呼び出した関数です。{function}がアクティブな関数の数よりも大きい数値の場合、getinfoはnilを返します。lua_getinfo(lua_getinfo()を参照)によって返されるすべてのフィールドが含まれている可能性があり、文字列{what}は、どのフィールドを埋めるかを記述します。{what}のデフォルトは、有効な行のテーブルを除き、利用可能なすべての情報を取得することです。fオプションが存在する場合、関数自体を含むfuncという名前のフィールドを追加します。Lオプションが存在する場合、有効な行のテーブルを含むactivelinesという名前のフィールドを追加します。debug.getinfo(1,"n").nameは、妥当な名前が見つかれば、現在の関数の名前を返し、debug.getinfo(print)は、print関数に関する利用可能なすべての情報を含むテーブルを返します。{thread},] {level}, {local}) debug.getlocal(){level}にある関数の、インデックス{local}を持つローカル変数の名前と値を返します。(最初のパラメータまたはローカル変数のインデックスは1から始まり、最後のアクティブなローカル変数まで続きます。)指定されたインデックスを持つローカル変数がない場合、関数はnilを返し、範囲外の{level}で呼び出された場合はエラーを発生させます。(debug.getinfo debug.getinfo()を呼び出して、レベルが有効かどうかを確認できます。)( (開き括弧) で始まる変数名は、内部変数(ループ制御変数、一時変数、C 関数のローカル変数)を表します。{func}, {up}) debug.getupvalue(){func}の、インデックス{up}を持つアップバリューの名前と値を返します。指定されたインデックスを持つアップバリューがない場合、関数はnilを返します。{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を呼び出すと無効なデータが返されます。{thread},] {level}, {local}, {value}) debug.setlocal(){level}にある関数の、インデックス{local}を持つローカル変数に値{value}を代入します。指定されたインデックスを持つローカル変数がない場合、関数はnilを返し、範囲外の{level}で呼び出された場合はエラーを発生させます。(getinfoを呼び出して、レベルが有効かどうかを確認できます。)それ以外の場合は、ローカル変数の名前を返します。{object}, {table}) debug.setmetatable(){object}のメタテーブルを指定された{table}(nilにすることもできます)に設定します。{func}, {up}, {value}) debug.setupvalue(){func}の、インデックス{up}を持つアップバリューに値{value}を代入します。指定されたインデックスを持つアップバリューがない場合、関数はnilを返します。それ以外の場合は、アップバリューの名前を返します。{thread},] [{message} [,{level}]]) debug.traceback(){message}文字列は、トレースバックの先頭に追加されます。オプションの{level}数値は、トレースバックを開始するレベルを示します(デフォルトは1、tracebackを呼び出す関数)。