Lua1.0使用与研究

转载 2013年12月04日 09:34:11

2008年偶然接触lua,但一直未在工作中使用。网上介绍lua有很多优点

我想lua的优秀一定有其优秀的dna。

虽然lua几个大版本之间有可能存在不兼容,但是他优秀的dna应该还是在早期版本上找到。

因此我开始看lua1.0的相关文档,代码。我希望能够坚持,最好能够多阅读几个版本。

-------------------------------------------------------------------------------
Lua1.0从来没有公开发不过。Lua1.0的代码是1993年7月28日的一份代码备份。
这份代码作为历史的古董,并且为了庆祝Lua发布十周年,特此发布出来。

在这份代码里,除了测试程序之外没有任何文档。
但是Lua1.1的手册可能同样适用于与Lua1.0。

lexer 和 parser的源码已经丢失,但是语法定义可以在 y_tab.c 和 yyreds里找到。

代码可以在RedHat 5.2系统上用gcc 2.7.2.3编译,运行。但是可能无法在较新的系统上
运行,因为代码里假定stdin 和 stdout 是常量,然而ANSI C代码没有指定他们必须是常
量。如果make失败,试一下fixed文件夹下的代码。可以通过make diff看一下他们之间的差别。

执行"make test",可以看一下Lua代码执行的结果。
-------------------------------------------------------------------------------
以上摘自Lua1.0 README 2012.08.16
这部分代码在vc下编译也是没问题的。

-------------------------------------------------------------------------------
Makefile
make all 编译生成lua可执行程序
make test 执行测试脚本sort.lua,globals.lua,array.lua,save.lua,test.lua
当然,我们可以手动执行某一个脚本,如 ./lua array.lua
make clean 清楚所有编译产生的文件,包括gdb调试文件。
make diff 如README里所说。

 

首先看一下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


$debug

    --在lua中起什么作用,暂时不清楚 2012.08.16
a = @()
    --在lua中起什么作用,暂时不清楚,但是根据代码上下文,应该是定义了一个数组a
      2012.08.16
    --定义table的语法,Lua通过table来实现数组
    --在Lua中习惯上数组的下标从1开始,Lua的标准库与此习惯保持一致。
      因此如果你的数组下标也是从1开始你就可以直接使用标准库的函数,
      否则就无法直接使用
    
i=0
while i<10 do
 a[i] = i*i
 i=i+1
end
    --上面这个代码在非交互式模式下,是一个语句块,在交互模式下i=0应该是一个独立的
      语句块。这些概念我是在lua5.1手册看到。先不管 2012.08.16
    --实现了为数组a的赋值
    --需要仔细关注table的

r,v = next(a,nil)
    --next是一个什么函数?作用?2012.08.16
    --在代码里应该是返回数组a的索引和值,因为lua里function可以返回多个值。2012.08.16
    --next(a,nil)应改返回数组a的第一个索引以及第一个值。2012.08.16
    --lua5.1 11..1
      --且数组不必事先指定大小,大小可以随需要动态的增长
      --可以根据需要定义数组的下标从0,1或者任意其他的数值开始
    --next的实现在hash.c文件lua_next函数
    
print ("array["..r.."] = "..v)
    --首先..是一个连接符号,挺像c++,java里的多个字符串相加的效果。
    --如果连接符号左右是数字,数值,将转化为字符串。2012.08.16
    --比c里打印数值要简单,如何实现打印不同格式的数值呢?2012.08.16

貌似lua代码里不支持中英文混排,起码在lua1.0里是这样。




 

k,v=nextvar(k)
while k do
 print(k)
 k,v=nextvar(k)
end


从文件名到代码,不难理解程序的本意就是将所有全局变量打印出来。

以下是运行结果,从结果看出lua中的全局变量包括所有的lib函数(strlib,iolib,mathlib),


以及lua.c里注册的c函数,最后还有本段lua代码产生的全局变量。

在lua代码里,如果没有声明为local,就是全局的。

在上面的截图中,只看到了全局变量k,没有看到v,不知是什么原因?


nextvar 访问的应该是个table。

在lua里table,hash应该是灵魂,opcode应该是灵魂寄住的地方,给了灵魂以生命。

因此table,hashopcode这些部分我在lua1.0里尽量晚的介入,前期尽量从使用角度体会,而不是从实现角度分析。

y_tab & lex_yy 由于没有其产生的源码,在lua1.0里我不会介入这部分,只把它当做一个黑盒使用。


根据以上的一些因素,以后我选择lib函数(strlib,iolib,mathlib)中的iolib进行初步的使用,实现lua与c的交互,这个才是大家喜欢使用lua的原因吧!

 

根据iolib.c了解到 iolib 注册的函数有
  readfrom
  writeto
  read
  write
  execute

  remove

在这里,readfrom,writeto是可以指定输入输出文件的,

我为了方便,并没有使用这两个接口进行测试,直接使用了默认的stdin和stdout进行io测试。

还记得..是连接符吗?

    write("sin (3) = "..sin(3).."\n")

会在终端上输出sin (3) = 0.14112

注意write接口不会自动增加换行符。例如下面的测试,如果想写入一个数字,然后换行,只能这样写。
    write("666.123","f<10.3")
    write("\r\n")
    write("666.123","f>10.3")
    write("\r\n")
    write("666.123","f|10.3")
    write("\r\n")

上面的f>,f<,f|叫做格式化写。看一下输出就知道什么意思了。


这个的f可不是format的意思,是float的意思,10表示输入字符串的宽度,.3表示小数点后的位数

觉得lua代码神奇的人,看看对应的c实现,是不是觉得也很容易。

如果想给写脚本的人提供方面,用你写的c去实现吧。


格式化读取
readtest = read("f5");
print("readret= "..readtest)

无格式化读取
readtest = read();
print("readret= "..readtest)


如果你输入空格,回车后,程序一直等待输入。因为lua实现会忽略前面输入的所有空格

另外write和read基于现在的功能,还是有优化空间的,毕竟是1.0版本。

大家可以测试一下。


如何实现一个lua脚本的循环执行呢,下面这个代码可以做到

loop.lua

print("I am looping")

execute('./lua loop.lua')

然后在终端输入  ./lua loop.lua ,loop.lua这个脚本将被反复执行,直到你按下ctrl+c

看一下execute对应的c代码,大家就都清楚是怎么回事了。

 

redis-cluster研究和使用

最近研究redis-cluster,正好搭建了一个环境,遇到了很多坑,系统的总结下,等到redis3 release出来后,换掉memCache 集群. 转载请注明出处哈:http://hot66ho...
  • sole_cc
  • sole_cc
  • 2014年09月03日 15:13
  • 779

技术研究思路以及Spark基础学习笔记

技术研究思路以及Spark基础学习笔记第一次用markdown,请多见谅。 - 如何确定的技术路线 我是如何确定要学习Spark的 - Spark学习笔记 Spark的基础知识技术选型思路《养生主...
  • zhaoenweiex
  • zhaoenweiex
  • 2017年02月13日 22:34
  • 143

转【个人觉得很有用的】Java虚拟机深入研究

Java技术与Java虚拟机    说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java...
  • u014462146
  • u014462146
  • 2014年04月08日 18:59
  • 681

计算机网络研究方向和网络安全问题

1)密码理论:研究高强度的密码理论,高速加解密算法,密码分析与攻击算法等     2)安全协议:研究安全协议的形式化方法,如BAN逻辑,串空间,SPI演算等;研究安全多方计算的基础理论  ...
  • moqingxinai2008
  • moqingxinai2008
  • 2016年12月28日 15:33
  • 600

前瞻性队列、回顾性队列、病例对照研究

一、前瞻性队列研究 研究对象的确定与分组根据研究开始时的实际情况,研究的结局需随访观察一段时间才能得到,这种研究可信度高、偏倚少,但费时、费人力、物力、财力。 二、回顾性队列研究 回顾性队列研究...
  • u012344939
  • u012344939
  • 2017年02月24日 18:31
  • 1048

研究linux内核的目的

一.研究内核的目的  欲举其事,先正其道。要谈论内核的研读以及交流心得,前提必须得有一个恰当准确的目的,方能收获良多。 很多人都有这样一个疑惑,为什么要研究内核呢?我们又不是内核开发者(或...
  • SunboyJohn690905084
  • SunboyJohn690905084
  • 2013年11月08日 18:14
  • 1418

机智云研究专题 | 2016年中国智能家电报告

简介:抢鲜看,智能家电运营管理服务平台机智云携手36氪、TalkingData、中国家用电器研究所整理出一份中国智能家电行业发展报告,点击:y0.cn/h5MSc 获取完整版本。...
  • gizwits_csdn
  • gizwits_csdn
  • 2017年04月21日 17:06
  • 463

做课题与科研项目常用的研究方法

研究方法不出“硬伤” 1、常用的研究方法有文献研究法、教育观察法、经验总结法、个案研究法、行动研究法、实验研究法、历史研究法、调查研究法、比较研究法、叙事研究法等。 2、研究类型或途径、或...
  • neilol
  • neilol
  • 2015年06月18日 15:28
  • 3080

CSS设计彻底研究

选择器CSS选择器主要包括id、class和标记选择器。复合选择器就是两个或多个基本选择器,通过不同方式连接而成的选择器。 交集选择器由连个选择器直接连接构成,其中第一个必须是标记选择器,第二个必须...
  • sysuzhyupeng
  • sysuzhyupeng
  • 2017年05月02日 14:14
  • 734

数据结构的定义和研究的内容

定义: 按照某种逻辑关系组织起来的一批数据,用一定的存储方式存储在计算机的存储器中,并在这些数据上定义一个运算的集合,就成为一个数据结构。 数据结构研究的内容如下: (1)数据的逻辑结构:按照某...
  • Johnnyzhunan
  • Johnnyzhunan
  • 2016年08月28日 18:21
  • 2429
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lua1.0使用与研究
举报原因:
原因补充:

(最多只允许输入30个字)