Lua1.0シナリオの初歩的な印象
まずハロー、world!解釈器が正常に動作するかどうかを見てみましょう.print(「hello,world」)は正常に出力され、解釈器が正常に動作することを示します.いくつかの公式のテストファイルを見てみましょう.array.lua
配列を定義し、値を設定して出力します.配列の下付き文字は0から始まり、これは後の比較的新しいLuaバージョンとは異なり、後のバージョンではLua配列の下付き文字はすべて1から始まります.ファイルの最初の行の$debugここでは何の役にも立たないが、この使い方はLua 1.1で何の役に立つかがわかります.その時になってからにしよう.ここではnext関数を用いて配列を巡る.globals.lua
グローバル変数nextvarを印刷して、次のグローバル変数に戻って、type、tonumber、next、nextvar、printがtableにあるかどうかを見ます.cではcallfunc,execstr,testをluaに定義する.cでreadfrom,writeto,read,write,execute,removeをiolibに定義する.cで定義するioライブラリ関数strfind,strlen,strsub,strlower,strupperはstrlib.cで定義、文字列ライブラリ関数abs,sin,cos,tan,asin,acos,atan,ceil,floor,mod,sqrt,pow,min,maxはmathlb.cで定義し、数学ライブラリ関数.k現在のファイルで定義されているが、なぜvがグローバル変数に現れないのか分からない.これはLua 1のはずです.0の1つのバグでしょう、これはLua 1まで待っています.1時に分析します.save.lua
現在のluaコードで定義されているグローバル変数はsavevarでtype(v)が定義されているため、Cコードで定義されているグローバル変数は印刷されません.typeはcfunctionであるためです.sort.lua
クイックソートとソートtestを選択します.lua
このファイルを実行しても反応しません.関数定義のみで、呼び出しがありません.printを追加してみてください:print(retorno_multiplo()はとても良くて、正常に実行して出力することができます.コマンドラインにこのファイルを追加してretorno_を追加することもできます.MultiploもLua 1のため呼び出されます.0最初のパラメータ(ファイル名)の後のパラメータを関数呼び出しとして扱う.type.lua
関連配列のタイプチェックとデフォルト値の設定.全体的に見ると、文法は現在のバージョンと大きく違います.構文に関連する部分が多すぎる場合、計画は主にコンパイラのバックエンドの実現、すなわちバイトコードの仮想マシンでの実行部分を分析する.もちろん、フロントエンドも分析することはありません.Lua 1.0の文法解析と文法解析の部分はツール(LexとYacc)で生成されているので、元のファイルを見ればわかります.
$debug
a = @()
i=0
while i<10 do
a[i] = i*i
i=i+1
end
r,v = next(a,nil)
while r ~= nil do
print ("array["..r.."] = "..v)
r,v = next(a,r)
end
配列を定義し、値を設定して出力します.配列の下付き文字は0から始まり、これは後の比較的新しいLuaバージョンとは異なり、後のバージョンではLua配列の下付き文字はすべて1から始まります.ファイルの最初の行の$debugここでは何の役にも立たないが、この使い方はLua 1.1で何の役に立つかがわかります.その時になってからにしよう.ここではnext関数を用いて配列を巡る.globals.lua
k,v=nextvar(k)
while k do
print(k)
k,v=nextvar(k)
end
print(i)
グローバル変数nextvarを印刷して、次のグローバル変数に戻って、type、tonumber、next、nextvar、printがtableにあるかどうかを見ます.cではcallfunc,execstr,testをluaに定義する.cでreadfrom,writeto,read,write,execute,removeをiolibに定義する.cで定義するioライブラリ関数strfind,strlen,strsub,strlower,strupperはstrlib.cで定義、文字列ライブラリ関数abs,sin,cos,tan,asin,acos,atan,ceil,floor,mod,sqrt,pow,min,maxはmathlb.cで定義し、数学ライブラリ関数.k現在のファイルで定義されているが、なぜvがグローバル変数に現れないのか分からない.これはLua 1のはずです.0の1つのバグでしょう、これはLua 1まで待っています.1時に分析します.save.lua
$debug
function savevar (n,v)
if v = nil then return end;
if type(v) = "number" then print(n.."="..v) return end
if type(v) = "string" then print(n.."='"..v.."'") return end
if type(v) = "table" then
if v.__visited__ ~= nil then
print(n .. "=" .. v.__visited__);
else
print(n.."=@()")
v.__visited__ = n;
local r,f;
r,f = next(v,nil);
while r ~= nil do
if r ~= "__visited__" then
if type(r) = 'string' then
savevar(n.."['"..r.."']",f)
else
savevar(n.."["..r.."]",f)
end
end
r,f = next(v,r)
end
end
end
end
function save ()
local n,v
n,v = nextvar(nil)
while n ~= nil do
savevar(n,v);
n,v = nextvar(n)
end
end
a = 3
x = @{a = 4, b = "name", l=@[4,5,67]}
b = @{t=5}
x.next = b
save()
現在のluaコードで定義されているグローバル変数はsavevarでtype(v)が定義されているため、Cコードで定義されているグローバル変数は印刷されません.typeはcfunctionであるためです.sort.lua
$debug
function quicksort(r,s)
if s<=r then return end -- caso basico da recursao
local v=x[r]
local i=r
local j=s+1
i=i+1; while x[i]<v do i=i+1 end
j=j-1; while x[j]>v do j=j-1 end
x[i],x[j]=x[j],x[i]
while j>i do -- separacao
i=i+1; while x[i]<v do i=i+1 end
j=j-1; while x[j]>v do j=j-1 end
x[i],x[j]=x[j],x[i]
end
x[i],x[j]=x[j],x[i] -- undo last swap
x[j],x[r]=x[r],x[j]
quicksort(r,j-1) -- recursao
quicksort(j+1,s)
end
function sort(a,n) -- selection sort
local i=1
while i<=n do
local m=i
local j=i+1
while j<=n do
if a[j]<a[m] then m=j end
j=j+1
end
a[i],a[m]=a[m],a[i] -- swap a[i] and a[m]
i=i+1
end
end
function main()
x=@()
n=-1
n=n+1; x[n]="a"
n=n+1; x[n]="waldemar"
n=n+1; x[n]="luiz"
n=n+1; x[n]="lula"
n=n+1; x[n]="peter"
n=n+1; x[n]="raquel"
n=n+1; x[n]="camilo"
n=n+1; x[n]="andre"
n=n+1; x[n]="marcelo"
n=n+1; x[n]="sedrez"
n=n+1; x[n]="z"
-- quicksort(1,n-1)
print(x[0]..","..x[1]..","..x[2]..","..x[3]..","..x[4]..","..x[5]..","..x[6]..","..x[7]..","..x[8]..","..x[9]..","..x[10])
sort (x, n-1)
print(x[0]..","..x[1]..","..x[2]..","..x[3]..","..x[4]..","..x[5]..","..x[6]..","..x[7]..","..x[8]..","..x[9]..","..x[10])
end
main()
クイックソートとソートtestを選択します.lua
$debug
function somaP (x1,y1,x2,y2)
return x1+x2, y1+y2
end
function norma (x,y)
return x*x+y*y
end
function retorno_multiplo ()
print (norma(somaP(2,3,4,5)))
end
このファイルを実行しても反応しません.関数定義のみで、呼び出しがありません.printを追加してみてください:print(retorno_multiplo()はとても良くて、正常に実行して出力することができます.コマンドラインにこのファイルを追加してretorno_を追加することもできます.MultiploもLua 1のため呼び出されます.0最初のパラメータ(ファイル名)の後のパラメータを関数呼び出しとして扱う.type.lua
$debug
function check (object, class)
local v = next(object,nil)
while v ~= nil do
if class[v] = nil then print("unknown field: " .. v)
elseif type(object[v]) ~= class[v].type
then print("wrong type for field " .. v)
end
v = next(object,v);
end
v = next(class,nil);
while v ~= nil do
if object[v] = nil then
if class[v].default ~= nil then
object[v] = class[v].default
else print("field "..v.." not initialized")
end
end
v = next(class,v);
end
end
typetrilha = @{x = @{default = 0, type = "number"},
y = @{default = 0, type = "number"},
name = @{type = "string"}
}
function trilha (t)
check(t,typetrilha)
end
--t1 = @trilha{ x = 4, name = "3"}
t1 = @{ x = 4, name = "3"}
a = "na".."me"
trilha(t1)
print(a)
関連配列のタイプチェックとデフォルト値の設定.全体的に見ると、文法は現在のバージョンと大きく違います.構文に関連する部分が多すぎる場合、計画は主にコンパイラのバックエンドの実現、すなわちバイトコードの仮想マシンでの実行部分を分析する.もちろん、フロントエンドも分析することはありません.Lua 1.0の文法解析と文法解析の部分はツール(LexとYacc)で生成されているので、元のファイルを見ればわかります.