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,hash,opcode这些部分我在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代码,大家就都清楚是怎么回事了。
分享到:
相关推荐
1. `lua.c`:这是Lua解释器的主要入口点,包含了大部分与解析、编译和执行Lua脚本相关的代码。你可以在这里找到如何读取、解释和执行Lua语句的实现。 2. `y_tab.c`:这个文件很可能涉及Lua的符号表(table)实现。...
通过研究这个早期版本,我们可以看到Lua是如何从一个简单的核心逐渐发展成为现今功能丰富且广泛使用的脚本语言。虽然Lua 1.0的功能相对有限,但它奠定了后续版本的基础,体现了其设计理念——简单、高效和可扩展。...
Lua Studio 1.0 是一个基于Lua编程语言的集成开发环境(IDE),它采用Lazarus作为其开发工具。Lazarus是Free Pascal项目的一部分,是一个开源、跨平台的Delphi克隆,提供了类似Delphi的可视化组件库和集成开发环境。...
这个“基于串口屏LUA脚本—定时器使用功能V1.0配套工程文件”很可能包含示例代码、文档和必要的库文件,帮助开发者更好地理解和实践上述知识点。通过深入研究这些文件,你可以了解到具体的实现细节,并将定时器功能...
2. **可扩展性**:Lua与宿主应用程序紧密集成,允许在运行时扩展其功能。通过提供C API,开发者可以轻松地用C语言编写库,然后在Lua中调用。 3. **效率**:Lua的解释器小巧且执行速度快。它的虚拟机使用栈式架构,...
在本文中,我们将深入探讨如何使用基于串口屏的LUA脚本来实现背光亮度保存功能,这在嵌入式系统和物联网设备中是常见的需求。这个V1.0配套工程文件提供了完整的解决方案,帮助开发者理解和实施这一特性。 首先,...
由于原生态的Nginx的一些安全防护功能有限,就研究能不能自己编写一个WAF,参考Kindle大神的ngx_lua_waf,自己尝试写一个了,使用两天时间,边学Lua,边写。不过不是安全专业,只实现了一些比较简单的功能: 功能...
在IT行业中,串口屏是一种...使用者可以通过解压并研究这些文件,理解并学习如何使用LUA脚本来实现串口屏的视频自循环播放。这个项目对于想要深入了解串口屏开发和LUA脚本应用的IT从业者来说,是一个很好的实践案例。
在本文中,我们将深入探讨如何使用串口屏和LUA脚本来实现循环播放音频的功能。这一技术在许多嵌入式系统、智能家居设备以及工业控制应用中都有广泛的应用。通过理解和掌握这一技术,开发者可以为他们的产品增加丰富...
《Tsar监视工具v1.0:深入了解网络监控与性能分析》 Tsar(Time Sharing Remote)是一款开源的网络性能监视工具,适用于Linux系统。它能够收集并展示系统的各项性能指标,包括网络流量、CPU使用率、内存使用情况、...
Redis 1.0 版本是其早期的一个稳定版本,对于初学者和想要深入理解 Redis 内核机制的人来说,研究其源码是很有价值的。 在 Redis 1.0 中,主要包含了以下关键知识点: 1. **数据结构**: Redis 支持多种数据类型,...
CCTKv1.0_Test.rar 是一个包含CCTK1.0测试示例程序的压缩包,这个压缩包主要用于展示CCTK的功能和用法。CCTK,全称可能是...如果你正在或打算使用Cocos2d-x进行游戏开发,深入研究CCTK将是一个非常有价值的步骤。
3. **绕过ngx_lua_waf**:分析了如何绕过基于ngx_lua的WAF。 4. **绕过X-WAF**:研究了绕过X-WAF防护的方法。 5. **绕过护卫神**:针对护卫神产品提供的WAF,介绍了绕过策略。 ### 番外篇和附录 番外篇和附录...
通过研究这些文件,开发者可以深入了解引擎的内部工作原理,学习如何在项目中集成和使用THScript引擎。同时,如果遇到问题,开发者可以通过博客文章中的详细信息找到解决方案,或者在社区中寻求帮助。
7. **脚本系统**:为了让非程序员也能调整游戏行为, Angle v1.0可能支持脚本语言,如Lua或Python,让开发者可以通过编写脚本来控制游戏逻辑。 8. **框架结构**:一个良好的游戏引擎应提供清晰的架构,使代码易于...
FreeSwitch是一个开源、多平台的通信系统,专为实时通信设计。它支持语音、视频、文本等多种通信方式,...通过深入研究这个1.0 beta1版本,你可以了解到早期FreeSwitch的设计思路,对比后来的版本,理解其演进过程。
总之,FreeSwitch 1.0 RC6是一个强大的VoIP平台,其源码提供了丰富的学习资源,对于想进入VoIP领域的开发者来说,深入研究“freeswitch-1.0.rc6.tar.gz”的源码和“K:\BAKYUN\DATADV1\VoIP\FreeSwitch\code”中的...
通过分析和研究这个项目,开发者不仅可以提升Cocos2d-x的使用技能,还能了解到游戏开发的整体流程,包括策划、设计、编程、测试等各个环节。对于初学者来说,这是一个很好的实践平台,而对于经验丰富的开发者,它则...
常见的游戏开发语言包括C++, C#, Java, Python等,而“其它”可能意味着它使用了如JavaScript、Lua或者一些专门为移动设备设计的游戏引擎如Unity、Cocos2d-x等。 游戏的核心算法主要涉及两个方面:状态管理和路径...
这款引擎的源码开放,为学习和研究提供了宝贵的资源,下面我们将深入探讨其主要特性和关键知识点。 **一、渲染引擎** AndroidAngle的核心是其图形渲染引擎,它基于OpenGL ES,这是一个针对嵌入式系统的图形库,...