Lua1.0シナリオの初歩的な印象

5356 ワード

まずハロー、world!解釈器が正常に動作するかどうかを見てみましょう.print(「hello,world」)は正常に出力され、解釈器が正常に動作することを示します.いくつかの公式のテストファイルを見てみましょう.array.lua
$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)で生成されているので、元のファイルを見ればわかります.