Lua1.0 脚本初步印象

转载出处:http://my.oschina.net/xhan/blog/305949

先来个 hello, 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 这里看不出有什么用,这个用法到 Lua1.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 没有在全局变量中出现。这个应该是 Lua1.0 的一个 bug 吧,这个等到 Lua1.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.."[email protected]()")
    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", [email protected][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()
 [email protected]()
 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 同样会调用到, 因为 Lua1.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)

关联数组的类型检查以及设置默认值。
总体来看,语法和现在的版本相比差别很大。对于语法相关的部分不过多分析,计划主要分析编译器后端的实现,也就是字节码在虚拟机中的执行部分。当然,前端也没有什么好分析的,Lua1.0 的词法分析和语法分析部分是用工具(Lex 和 Yacc)生成的,看下原始文件就明白了。

时间: 2024-12-21 16:06:51

Lua1.0 脚本初步印象的相关文章

Lua1.0 环境准备

转载出处:http://my.oschina.net/xhan/blog/306719 从 lua.c 的 main 函数开始,看看在代码执行过程中中发生了什么? 1 2 3 4 5  if (argc < 2)  {   puts ("usage: lua filename [functionnames]");   return;  } Lua1.0 执行时至少要有一个参数,否则直接退出.接着是三个 lua_register . ? 1 2 3  lua_register (&

转来的——python webdriver自动化测试初步印象——转来的

python webdriver自动化测试初步印象 以下示例演示启动firefox,浏览google.com,搜索Cheese,等待搜索结果,然后打印出搜索结果页的标题 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.

Shel脚本-初步入门之《02 什么是 Shell 脚本》

Shel脚本-初步入门-什么是 Shell 脚本 2.什么是 Shell脚本 当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,改程序就被称为 Shell 脚本.如果在 Shell 脚本里内置了很多条命令.语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行脚本的方式称为非交互式的方式.这些命令.变量和流程控制语句等有机地结合起来,就形成了一个功能强大的 Shell 脚本. 范例1: 清除 /var/log 下 messages 日志文件的简单命令脚本 把所有命令放在一个

Lua1.0 代码分析 table.c

转载出处:http://my.oschina.net/xhan/blog/307961 table.c 代码分析 全局符号,常量,字符串,关联数组,文件列表的定义. 全局符号: 初始有 5 个基本的符号,Lua 预设的函数和库函数都注册在里面. 常量: 初始的几个常量是 Lua 中 type 的名字. 字符串表,关联数组表,文件列表 所有的这些在 table.c 中定义的这些数组可以认为是 Lua 的全局注册表空间,Lua 的环境. 函数分析 ? 1 2 3 4 5 6 7 8 9 10 11

Lua1.0 编译准备

转载出处:http://my.oschina.net/xhan/blog/305943 从官网 www.lua.org/ftp/lua-1.0.tar.gz 下代码.如何编译,ReadMe 里有这样的说明: The code compiles and runs in RedHat 5.2 with gcc 2.7.2.3. It may not run innewer systems, because it assumes that stdin and stdout are constants,

Lua1.0 代码分析 库

Lua1.0 代码分析 库库的代码相对比较简单.这里以数学库为例进行说明.比如看下这个取绝对值的数学函数 static void math_abs (void) {  double d;  lua_Object o = lua_getparam (1);  if (o == NULL)  { lua_error ("too few arguments to function `abs'"); return; }  if (!lua_isnumber(o))  { lua_error (

Retrofit2.0 的初步使用

Retrofit2.0 的初步使用 首先我就不介绍了,直接说下怎么使用,本身我也是刚刚因为要仿照微软的azure-sdk-for-java(git地址是:https://github.com/Azure/azure-sdk-for-java.git) 然后去编写一个类似的程序里面就设计到了Retrofit. 我也是刚刚才使用所以说叫我讲啥原理我肯定不怎么会讲,所以这里就是告诉大家怎么使用,里面可能有些代码不怎么好,希望大家一起指出来,我会慢慢改正,请大家见谅. 首先我是把Retrofit跟OkH

Storm与MRv1类比--Storm初步印象

MRv1 Storm JobTracker Nimbus TaskTracker Supervisor Child Worker Job Topology Map/Reduce Spout/Blot shuffle Stream grouping Storm与MRv1类比--Storm初步印象

Lua1.0 写在最初

为什么是 Lua忘记是什么时候接触到 Lua 的了,也忘记是为什么接触到她的.现在想想,也许是因为下面两个原因:WOW 里有用到她,我上学的时候,玩过一段时间 WOW,了解一点 WOW 插件的编写,当时觉得这个语言挺有意思的.她是由 C 代码实现的,下载代码看了一下,发现她的官方实现的 C 代码写得很好,我是一个代码爱好者,面对这么优秀的代码,有种相见恨晚之感. 为什么是 Lua1.0我是一个代码爱好者,总觉得看代码的最初实现会比较容易把握作品的脉络.我不知道这种学习方法对不对,不过,或许是强迫