整理的Lua程序设计,很完整

合集下载

LUA参考手册

LUA参考手册

Lua参考手册Wikipedia,自由的百科全书Lua 5.0 参考手册作者:Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes Copyright © 2003 Tecgraf, PUC-Rio. All rights reserved.主要译者、维护人员:曹力丁舜佳[NirvanaStudio ()] 目录[隐藏]1 1 - 绪论2 2 - 语言2.1 2.1 - 词法约定2.2 2.2 - 值和类型2.2.1 2.2.1 - 类型转换2.3 2.3 - 变量2.4 2.4 - 语句2.4.1 2.4.1 - 语句段2.4.2 2.4.2 - 语句块2.4.3 2.4.3 - 赋值2.4.4 2.4.4 - 控制结构2.4.5 2.4.5 - For 语句2.4.6 2.4.6 - 语句式函数调用页脚内容12.4.7 2.4.7 - 局部变量声明2.5 2.5 - 表达式2.5.1 2.5.1 - 算术运算符2.5.2 2.5.2 - 关系运算符2.5.3 2.5.3 - 逻辑运算符2.5.4 2.5.4 - 串联接2.5.5 2.5.5 - 优先级2.5.6 2.5.6 - 表构造器2.5.7 2.5.7 - 函数调用2.5.8 2.5.8 - 函数定义2.6 2.6 - 可见性规则2.7 2.7 - 错误处理2.8 2.8 - 元表2.9 2.9 - 垃圾收集2.9.1 2.9.1 - 垃圾收集元方法2.9.2 2.9.2 - 弱表2.10 2.10 - 同步程序3 3 - 应用程序接口3.1 3.2 - 堆栈和索引3.2 3.3 - 堆栈操作页脚内容23.3 3.4 - 堆栈查询3.4 3.5 - 堆栈取值3.5 3.6 - 将值压入堆栈3.6 3.7 - 控制垃圾收集3.7 3.8 - 用户数据类型3.8 3.9 - 元表3.9 3.10 - 加载Lua语句段3.10 3.11 - 表操作3.11 3.13 - 将表作为数组使用3.12 3.14 - 调用函数3.13 3.15 - 受保护调用3.14 3.16 - 定义C 函数3.15 3.17 - 定义C 函数闭包3.16 3.18 - 注册表3.17 3.19 - C 中的错误处理3.18 3.20 - 线程4 4 - 调试接口4.1 4.1 - 堆栈及函数信息4.2 4.2 - 操作局部变量和上值4.3 4.3 - 钩子页脚内容35 5 - 标准库5.1 5.1 - 基本函数5.2 5.2 - Coroutine Mani***tion5.3 5.3 - String Mani***tion5.3.1 string.byte (s [, i])5.3.2 string.char (i1, i2, ...)5.3.3 string.dump (function)5.3.4 string.find (s, pattern [, init [, plain]])5.3.5 string.len (s)5.3.6 string.lower (s)5.3.7 string.rep (s, n)5.3.8 string.sub (s, i [, j])5.3.9 string.upper (s)5.4 5.4 - Table Mani***tion5.5 5.5 - Mathematical Functions5.6 5.6 - Input and Output Facilities5.7 5.7 - Operating System Facilities5.8 5.8 - The Reflexive Debug Interface6 6 - Lua 独立程序7 致谢页脚内容48 与以前版本的不兼容性8.1 语言上的变动8.2 库的变更8.3 API 上的改动9 Lua 完整语法参考1 - 绪论Lua是一种为支持有数据描述机制的一般过程式编程语言而设计的扩展编程语言。

Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)

Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)

Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言).txt蜜蜂整日忙碌,受到赞扬;蚊子不停奔波,人见人打。

多么忙不重要,为什么忙才重要。

在这篇文章中,我想向大家介绍如何进行Lua程序设计。

我假设大家都学过至少一门编程语言,比如Basic或C,特别是C。

因为Lua的最大用途是在宿主程序中作为脚本使用的。

Lua的语法比较简单,学习起来也比较省力,但功能却并不弱。

在Lua中,一切都是变量,除了关键字。

请记住这句话。

I.首先是注释写一个程序,总是少不了注释的。

在Lua中,你可以使用单行注释和多行注释。

单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。

相当于C++语言中的"//"。

多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。

这种注释相当于C语言中的"/*…*/"。

在注释当中,"[["和"]]"是可以嵌套的。

II. Lua编程经典的"Helloworld"的程序总是被用来开始介绍一种语言。

在Lua中,写一个这样的程序很简单:print("Hello world")在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开。

一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。

Lua有好几种程序控制语句,如:条件控制:if条件then…elseif条件then…else…endWhile循环:while条件do…endRepeat循环:repeat…until条件For循环:for变量=初值,终点值,步进do…endFor循环:for变量1,变量2,…,变量N in表或枚举函数do…end注意一下,for的循环变量总是只作用于for的局部变量,你也可以省略步进值,这时候,for循环会使用1作为步进值。

Lua代码编写规范

Lua代码编写规范

Lua代码编写规范Lua代码编写规范开发中,⼤量使⽤lua,暂时根据当前状况,总结相对⽽⾔较好的规范,在多⼈协作中可以更好的开发、交流。

介绍该⽂档旨在为使⽤lua编写应⽤程序建⽴编码指南。

制订编码规范的⽬的:统⼀编码标准,通⽤,提⾼开发效率;使代码通俗易懂,易于维护。

切记:善⽤调试器。

⼀、命名惯例1.所有lua⽂件命名时使⽤⼩写字母、下划线2.类名、变量名尽可能使⽤有意义的英⽂,类名使⽤,变量名使⽤3.常量、消息号定义时⽤⼤写,单词间 _ 分割 eg:KIND_PET_FOOD4.枚举值定义时 加前缀 enum_5. 函数名使⽤骆驼式命名法注:骆驼式命名法:第⼀个单字以⼩写字母开始;第⼆个单字的⾸字母⼤写或每⼀个单字的⾸字母都采⽤⼤写字母帕斯卡命名法:和骆驼命名法很像,只有⼀点区别,就是⾸字母要⼤写。

(单字之间不以空格断开或连接号)⼆、⽂件组织1. ⽂件开头加上此⽂件的功能、职责的简要描述;如下:---- Author: Feng-- Date: XXXX-XX-XX-- 功能描述每个⽂件都加module 限定词; 导⼊的模块都加 local 限定词;或者使⽤(module(..., package.seeall)),这样便于进⾏热更新2. 所有提供外部函数都加如下格式的注释。

例如:--此函数检测是否可以从A(oldx, oldy)点⾛到B点(newx, newy)--@param oldx 当前所在点x--@param oldy 当前所在点y--@param newx ⽬标点x--@param newy ⽬标点y--@return 若可以到达,返回true;否则返回falsefunction Object:checkBar(oldx, oldy, newx, newy)…end3. 函数与函数间、以及⼀些定义之间加上空⾏。

4. 函数内的临时变量、⽂件内的局部函数都加上 local 限定词5. 函数的⾏数过长(⼤于100⾏)时,尽量拆分为多个⼦函数;函数中⼀些晦涩的部分,⼀定要加上注释。

Lua程序设计基础知识4

Lua程序设计基础知识4

一、Lua程序设计基础知识 (4)1、概述 (4)2、Lua程序的基本运行方式 (5)1)主循环体 (5)2)适时的释放CPU资源 (6)3)外置看门狗及喂狗方式 (7)4)虚拟机间数据交换 (7)5)Lua采用自动内存管理 (7)6)简单的例子程序 (7)3、Lua基本语法 (9)1)Lua编程默认约定 (9)2)Lua的变量定义 (9)3)Lua程序的变量类型及赋值 (10)4)if判断语句 (11)5)While循环 (12)6)For循环 (12)4、Lua数组 (14)1)数组的定义 (14)2)定义数组为发送缓冲 (14)3)定义数组为接收缓冲 (15)4)数组操作函数 (15)5、Lua函数定义及使用 (16)1)函数的定义 (16)2)函数的返回值 (16)3)AiMaster的公用函数定义 (17)6、Lua不支持在循环内调用continue (18)二、Lua编程界面的使用 (19)1)进入Lua编程界面 (19)2)上传代码至目标设备并运行 (19)3)另存项目 (24)4)错误信息的提示 (25)三、故障排除 (26)1)从死锁状态中恢复 (26)四、Lua扩展库概述 (28)五、Lua常用的基本函数库 (29)1)print函数 (29)2)format字符串格式化函数 (30)六、系统函数库 (31)1)ossleep将代码暂停一段时间 (31)2)osresetwdog喂狗函数 (32)3)setfwver设置固件版本字符串函数 (32)七、调试(Debug)函数库 (33)1)printarray以16进制显示一个数组 (33)2)dbgsleep将代码暂停一段时间 (34)八、数组函数库 (35)1)table.getn取得数组内元素数量函数 (35)2)table.sort排序数组函数 (35)3)lib_extab.copyarray在两个数组间复制数据 (36)4)lib_extab.initarray:用指定的值和长度初始化一个数组 (37)九、串口函数库 (38)1)queryuart串口轮询函数 (38)2)uart_tx串口发送数据函数 (39)3)uart_rx接收下位机串口数据函数 (40)4)queryuart_str ASCII格式数据的串口轮询函数 (41)5)uart_txstr ASCII格式数据串口发送函数 (42)6)uart_rxstr 接收下位机ASCII格式的串口数据函数 (42)7)setuarttype设置串口类型 (43)十、数据转换函数库 (44)1)copytoword函数转换数组16进制数据至word数据 (44)2)copytoint函数转换数组16进制数据至int数据 (45)3)copytofloat函数转换数组16进制数据至float数据 (45)4)strtofloat函数转换字符串数据至float数据 (46)5)wordtoarray函数将word数据复制进数组 (47)6)inttoarray函数将int数据复制进数组 (48)7)floattoarray函数将float数据复制进数组 (49)十一、Modbus虚拟机接口函数 (51)1)setvaluefc1设置功能码01的寄存器值 (51)2)setvaluefc2设置功能码02的寄存器值 (54)3)setvaluefc3设置功能码03的寄存器值 (56)4)regvmbwrfc05注册功能码05消息 (65)5)regvmbwrfc06注册功能码06消息 (68)6)regvmbwrfc16注册功能码16消息 (71)7)getvaluefc1读取modbus虚拟机01功能码的寄存器数据 (83)8)getvaluefc2读取modbus虚拟机02功能码的寄存器数据 (84)9)getvaluefc3读取modbus虚拟机03功能码的寄存器数据 (85)10)waitwrevent等待Modbus虚拟机发送写命令消息 (86)11)responsewrevent函数返回写命令成功消息,setwrerror函数返回写命令失败消息 (87)12)读取Modbus写信息函数getwrdata、getwrfc、getwrreg、getwrsid (89)13)setregstate设置Modbus虚拟机寄存器状态 (90)14)getwrcount在功能码为16写多寄存器时,此函数获得写入数据的个数 (91)十二、校验算法库 (93)1)calcrc16计算Modbus CRC16校验码 (93)2)calsum8bit计算数据数组的8位加和检验数据 (95)3)calsum16bit计算数据数组的16位加和检验数据 (96)4)checkcrc16检查数据数组的Modbus CRC16校验数据是否正确 (97)5)checksum8bit检查数据数组的8位校验和(sum8)数据是否正确 (99)6)checksum16bit检查数据数组的16位校验和(sum16)数据是否正确 (101)十三、位操作函数库 (103)1)shr:右移位函数 (103)2)shl:左移位函数 (103)3)lor:或运算函数 (104)4)land:与运算函数 (104)5)lnot:取反运算函数 (104)6)lxor:异或运算函数 (105)7)lclr:将指定的多个位同时设置为0 (105)8)lsetbit:将指定的位设置为1 (105)9)lclrbit:将指定的位设置为0 (106)十四、共享内存函数库 (107)1)setstr、getstr:字符串格式key读写字符串数据(string) (108)2)setint、getint:字符串格式key读写整数数据(int) (109)3)setfloat、getfloat:字符串格式key读写浮点数数据(Value) (110)4)setarray、getarray:字符串格式key读写数组(Value) (111)5)ik_setstr、ik_getstr:整数(int)格式key读写字符串数据(string) (112)6)ik_setint、ik_getint:整数(int)格式key读写整数数据(int) (113)7)ik_setfloat、ik_getfloat:整数(int)格式key读写浮点数(float) (114)8)ik_setarray、ik_getarray:整数(int)格式key读写数组数据 (115)9)ak_setarray、ak_getarray:数组格式key读写数组数据 (117)十五、垃圾收集 (119)十六、其他 (120)十七、协议转换例子1 (121)1)概述 (121)2)数据简介 (121)3)Lua代码 (121)十八、协议转换例子2 (124)1)概述 (124)2)数据简介 (124)3)Lua代码 (124)十九、ASCII格式数据转换例子(GPS数解析) (127)1)概述 (127)2)数据简介 (127)3)Lua代码 (127)4)执行结果 (129)一、Lua程序设计基础知识1、概述Lua是一种解释型的脚本语言,广泛应用于路由器功能管理、游戏客户端等各种领域的产品,AiMaster产品首次将Lua作为嵌入式编程语言,用于任意协议转Modbus应用、通用型串口主机应用等相关产品。

Lua 语言 详解

Lua 语言 详解

脚本制作实例讲解: 脚本制作实例讲解:助手的Lua脚本制作需要你对编程有一定基础,特别是脚本编程;需要你熟悉Lua 基本的语法结构、程序结构、使用习惯及约定、注意事项等。

只要你有一定的编程基础, 并基于以上知识的了解和学习,脚本制作将不难进行。

助手的Lua脚本制作中关于模拟操 作的脚本你还需要清楚你实现模拟操作的每一个细节,要能分解每一个细节到程序实现 上,这样你才能更好的完成脚本。

下面我们举出一个具体的魔兽操作实例脚本给大家一个 脚本制作实现思路和方式。

我们来看一个魔兽内吃药脚本的实现。

脚本实例: 脚本实例:魔兽吃药脚本 思路准备: 1. 思路准备:魔兽吃药是玩魔兽的一个关键项,然而有些地图药品繁多更显吃药之特点。

吃药虽然是一个简单的事情,但是当我们玩一个单机或挂机升级的图时,能自动 吃药挂机那将是有用的了,我们就此来进行实现魔兽自动吃药挂机的脚本,其中 吃药最常见的就是一点即用型药品了,还有一种使用后需要指定目标的麻烦点, 但是新版本的智能改键指令加上执行改键序列函数实现起来也是很简单的事。

而 且最好能挂机吃药魔兽可以不再前端,那我们就可以挂机干其他事了^_^。

实现思想: 2. 实现思想:要进行自动吃药监视我们要先想如何自动法?自动的前提当然是要定时检测 当前英雄血蓝量,这就需要用到定时器和延时;检查血量又需要用到查询单位属 性getunitattribute函数,此外还需要用到键鼠模拟操作函数等。

下面我们以一 个具体地图实例来讲解脚本制作。

地图就选择风霜的《遗失的记忆》吧开始编写测试修改代码: 3. 开始编写测试修改代码:基于以上的准备那我们先新建一个脚本,暂时命名为“runAutoPress.txt”吧, 下面就逐步开始代码吧: 1) 先定义几个可能用到的变量和初始值,并将血瓶放到包裹7位置,魔瓶放到 包裹8位置。

hppt=0.75 --血量值监视限度保户值,即血量值的 75% mppt=0.15 --魔法值监视限度保户值,即魔法值的 15% msPress=200 --监视间隔时间,暂停200ms 2) 设置对应血魔监视的定时器函数,并加入基本代码: function runAutoPressFunc() if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt then --判断当前的血量值比率是否小于设定 值 keypress(103) --小于则执行小键盘7按键加血 end if mp/mpmax<mppt then --判断当前魔法值是比率否小于设定值 keypress(104) --小于则执行小键盘8按键加魔end end end tmAutoPress=settimer(msPress, 'runAutoPressFunc') keypress(103)可用runkeys(“使用物品dpsp”)代替,keypress(104)可用 runkeys(“使用物品lclp”),其中dpsp为中型生命药水ID,lclp为中型魔法药水 ID,2者效果相同,只是参数及使用不同,keypress需要指定物品位置,而 runkeys需要指定使用物品ID。

LUA脚本语言参考文档

LUA脚本语言参考文档

Lua 5.1参考手册by Roberto Ierusalimschy,Luiz Henrique de Figueiredo,Waldemar Celes云风译Copyright©,PUC-Rio.All rights reserved.1-介绍Lua是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。

Lua也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。

它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。

Lua以一个用clean C写成的库形式提供。

(所谓Clean C,指的ANSI C和C++中共通的一个子集)作为一个扩展式语言,Lua没有"main"程序的概念:它只能嵌入一个宿主程序中工作,这个宿主程序被称作embedding program或简称为host。

宿主程序可以通过调用函数执行一小段Lua代码,可以读写Lua变量,可以注入C函数让Lua代码调用。

这些扩展的C函数,可以大大的扩展了Lua可以处理事务的领域,这样就可以订制出各种语言,而它们共享一个统一的句法格式的框架。

Lua的官方发布版就包含了一个叫做lua的简单的宿主程序,它用Lua库提供了一个保证独立的Lua解释器。

Lua是一个自由软件,它的使用许可决定了对它的使用过程一般没有任何保证。

这份手册中描述的东西的实现,可以在Lua的官方网站找到,跟其它的许多参考手册一样,这份文档有些地方比较枯燥。

关于Lua的设计想法的探讨,可以看看Lua网站上提供的技术论文。

有关用Lua编程的细节介绍,可以读一下Roberto 的书,Programming in Lua(Second Edition)。

2-语言这一节从词法、语法、句法上描述Lua。

换句话说,这一节描述了哪些token(符记)是有效的,它们如何被组合起来,这些组合方式有什么含义。

关于语言的构成概念将用常见的扩展BNF表达式写出。

c语言的lua库编写

c语言的lua库编写

c语⾔的lua库编写gcc编译gcc -I/usr/local/include/ -L/usr/local/lib/ -lm -o engine_mlisten_lua ./src/engine_mlisten_lua.c -levent -lpthread -ldl /usr/local/lib/liblua.aLua可以调⽤C函数的能⼒将极⼤的提⾼Lua的可扩展性和可⽤性。

对于有些和操作系统相关的功能,或者是对效率要求较⾼的模块,我们完全可以通过C函数来实现,之后再通过Lua调⽤指定的C函数。

对于那些可被Lua调⽤的C函数⽽⾔,其接⼝必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L)。

简单说明⼀下,该函数类型仅仅包含⼀个表⽰Lua环境的指针作为其唯⼀的参数,实现者可以通过该指针进⼀步获取Lua代码中实际传⼊的参数。

返回值是整型,表⽰该C函数将返回给Lua代码的返回值数量,如果没有返回值,则return 0即可。

需要说明的是,C函数⽆法直接将真正的返回值返回给Lua代码,⽽是通过虚拟栈来传递Lua代码和C函数之间的调⽤参数和返回值的。

这⾥我们将介绍两种Lua调⽤C函数的规则。

1. C函数作为应⽤程序的⼀部分。

1 #include <stdio.h>2 #include <string.h>3 #include <lua.hpp>4 #include <lauxlib.h>5 #include <lualib.h>67 //待Lua调⽤的C注册函数。

8 static int add2(lua_State* L)9 {10 //检查栈中的参数是否合法,1表⽰Lua调⽤时的第⼀个参数(从左到右),依此类推。

11 //如果Lua代码在调⽤时传递的参数不为number,该函数将报错并终⽌程序的执⾏。

用Lua编写一个简易的弹珠游戏

用Lua编写一个简易的弹珠游戏

用Lua编写一个简易的弹珠游戏使用Lua编写一个简易的弹珠游戏弹珠游戏是一种经典的街机游戏,通过控制一根弹簧装置射出小球,并让小球反弹击中不同位置的目标来得分。

在本文中,我们将使用Lua 编写一个简单的弹珠游戏。

以下是游戏设计的步骤:1. 游戏背景设置在游戏中,我们需要创建一个游戏窗口,设置游戏背景和其他必要的元素。

我们可以使用Lua的图形库来实现这一点,例如使用`love.graphics`库。

2. 弹球设计在游戏中,弹球是一个重要的元素。

我们需要定义弹球的大小、颜色和初始位置。

我们还需要定义弹球的速度和运动方向。

使用Lua的变量来存储这些信息,并在游戏中使用。

3. 弹板设计弹板是玩家用来控制弹球的设备。

我们可以定义弹板的尺寸、颜色和位置。

可以使用键盘事件来控制弹板的移动,例如使用`love.keyboard`库。

4. 目标设计游戏中的目标是弹球可以击中的物体。

可以使用图形库来创建目标的形状和颜色。

我们可以定义多个目标,并在游戏中设置其初始位置和状态。

5. 游戏逻辑与碰撞检测在游戏中,我们需要检测弹球与弹板和目标之间的碰撞。

可以使用条件语句来检测碰撞,并根据碰撞结果来更新游戏状态。

例如,当弹球碰到目标时,玩家得分增加。

6. 分数系统和游戏结束在游戏中,我们需要实现一个分数系统,并在适当的时候显示玩家的得分。

当玩家无法击中目标时,游戏结束。

可以通过设置游戏状态并显示相关信息来实现游戏结束的效果。

7. 用户界面和音效为了增加游戏体验,我们可以在游戏中添加一些用户界面元素,例如开始菜单、暂停按钮和游戏结束画面。

我们还可以使用Lua的声音库来添加音效,例如弹球碰撞的声音效果。

以上是一个简易弹珠游戏的设计过程。

使用Lua编程语言,我们可以使用其丰富的库来实现游戏中所需的功能和效果。

通过编写相应的代码并按照设计步骤来组织代码结构,我们可以完成一个简单的弹珠游戏。

希望这篇文章对你有所帮助!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Programming in LuaLua程序设计作者:Roberto Ierusalimschy翻译:制作:中国lua开发者相关链接:lua中文在线手册译序“袁承志知道若再谦逊,那就是瞧人不起,展开五行拳,发拳当胸打去。

荣彩和旁观三人本来都以为他武功有独到之秘,哪知使出来的竟是武林中最寻常不过的五行拳。

敌对三人登时意存轻视,温青脸上不自禁露出失望的神色。

“荣彩心中暗喜,双拳如风,连抢三下攻势,满拟自己的大力魔爪手江南独步,三四招之间就可破去对方五行拳,那知袁承志轻描淡写的一一化解。

再拆数招,荣彩暗暗吃惊,原来对方所使虽是极寻常的拳术,但每一招均是含劲不吐,意在拳先,举手抬足之间隐含极浑厚的内力。

”——金庸《碧血剑》编程语言之于程序员,若武功招式之于习武之人,招式虽重要,却更在于使用之人。

胜者之道,武功只行于表,高手用剑,片草只叶亦威力无穷。

当今武林,派别林立,语言繁杂,林林总总不计其数。

主流文化的C/C++、Java、C#、VB[1];偏安一隅的Fortran;动态语言中的Perl、Tcl、Ruby、Forth、Python,以及本书介绍的Lua;……,等等等等。

再加上世界上那些不知道躲在哪的旮旯的奇奇怪怪的hacker捣鼓出来的异想天开的语言,要想各类语言样样精通,不异于痴人说梦。

不信可欣赏一下BrainFuck语言[2]的Hello World程序,语言本身依如其名。

-☺->+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>+++++++ +[<++++>-]<.#>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.虽说语言的威力依使用者本身的修为高低而定,但不同语言本身的设计又有不同。

若让用Java写写操作系统内核、Perl写写驱动程序、C/C++写写web应用,都无异于舍近求远,好刀只用上了刀背。

Lua本身是以简单优雅为本,着眼于处理那些C不擅长的任务。

借助C/C++为其扩展,Lua可闪现无穷魅力。

Lua本身完全遵循ANSI C而写成,只要有C编译器的地方,Lua便可发挥她的力量。

Lua不需要追求Python那样的大而全的库,太多累赘,反而破坏了她的优美。

语言的优美,来自于使用者自己的感悟。

Lua的优雅,也只有使用后才会明白。

扬起帆,让我们一同踏上Lua的学习之旅……本书的翻译,是中朋友们共同努力的结果。

下面是参与翻译与校对的朋友:-- file: 'thanks.lua'-- desc: to print the list of the contributing guyshelpful_guys = {"----参与翻译----","buxiu", "凤舞影天", "zhang3","morler", "lambda", "sunlight","\n","----参与校对----","凤舞影天", "doyle", "flicker","花生魔人", "zhang3", "kasicass","\n"}for _,e in ipairs(helpful_guys) doprint(e)end翻译组2005年7月26日第一篇语言第0章序言本章包括作者的序言、文章的体例(convention)以及其它一些“每本书开头都会的内容”。

0.1 序言目前很多程序语言都专注于帮你编写成千上万行的代码,所以此类型的语言所提供的包、命名空间、复杂的类型系统及无数的结构,有上千页的文档需要操作者学习。

而Lua并不帮你编写大量的代码的程序,相反的,Lua仅让你用少量的代码解决关键问题。

为实现这个目标,像其他语言一样Lua依赖于其可扩展性。

但是与其他语言不同的是,不仅用Lua编写的软件易于扩展,而且用其他语言比如C/C++编写的软件也很容易使用Lua扩展其功能。

一开始,Lua就被设计成很容易和传统的C/C++整合的语言。

这种语言的二元性带来了极大的好处。

Lua是一个小巧而简单的语言,因为Lua不致力于做C 语言已经做得很好的领域,比如:性能、底层操作以及与第三方软件的接口。

Lua 依赖于C去做完成这些任务。

Lua所提供的机制是C不善于的:高级语言、动态结构、简洁、易于测试和调试等。

正因为如此,Lua具有良好的安全保证,自动内存管理,简便的字符串处理功能及其他动态数据的改变。

Lua不仅是一种易于扩展的语言,也是一种易整合语言(glue language);Lua支持基于组件的,我们可以将一些已经存在的高级组件整合在一起实现一个应用软件。

一般情况下,组件使用像C/C++等静态的语言编写。

但Lua是我们整合各个组件的粘合剂。

又通常情况下,组件(或对象)表现为具体在程序开发过程中很少变化的、占用大量CPU时间的决定性的程序,例如窗口部件和数据结构。

对那种在产品的生命周期内变化比较多的应用方向使用Lua可以更方便的适应变化。

除了作为整合语言外,Lua自身也是一个功能强大的语言。

Lua不仅可以整合组件,还可以编辑组件甚至完全使用Lua创建组件。

除了Lua外,还有很多类似的脚本语言,例如:Perl、Tcl、Ruby、Forth、Python。

虽然其他语言在某些方面与Lua有着共同的特色,但下面这些特征是Lua特有的:①可扩展性。

Lua的扩展性非常卓越,以至于很多人把Lua用作搭建领域语言的工具(注:比如游戏脚本)。

Lua被设计为易于扩展的,可以通过Lua代码或者C代码扩展,Lua的很多功能都是通过外部库来扩展的。

Lua很容易与C/C++、java、fortran、Smalltalk、Ada,以及其他语言接口。

②简单。

Lua本身简单,小巧;内容少但功能强大,这使得Lua易于学习,很容易实现一些小的应用。

他的完全发布版(代码、手册以及某些平台的二进制文件)仅用一张软盘就可以装得下。

③高效率。

Lua有很高的执行效率,统计表明Lua是目前平均效率最高的脚本语言。

④与平台无关。

Lua几乎可以运行在所有我们听说过的系统上,如NextStep、OS/2、PlayStation II (Sony)、Mac OS-9、OS X、BeOS、MS-DOS、IBM mainframes、EPOC、PalmOS、MCF5206eLITE Evaluation Board、RISC OS,及所有的Windows 和Unix。

Lua不是通过使用条件编译实现平台无关,而是完全使用ANSI (ISO) C,这意味着只要你有ANSI C编译器你就可以编译并使用Lua。

Lua大部分强大的功能来自于他的类库,这并非偶然。

Lua的长处之一就是可以通过新类型和函数来扩展其功能。

动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出。

高级函数和匿名函数均可以接受高级参数,使函数更为通用。

Lua自带一个小规模的类库。

在受限系统中使用Lua,如嵌入式系统,我们可以有选择地安装这些类库。

若运行环境十分严格,我们甚至可以直接修改类库源代码,仅保留需要的函数。

记住:Lua是很小的(即使加上全部的标准库)并且在大部分系统下你仍可以不用担心的使用全部的功能。

0.2 Lua的使用者Lua使用者分为三大类:使用Lua嵌入到其他应用中的、独立使用Lua的、将Lua和C混合使用的。

第一:很多人使用Lua嵌入在应用程序,比如CGILua(搭建动态网页)、LuaOrb (访问CORBA对象。

这些类型用Lua-API注册新函数,创建新类型,通过配置Lua就可以改变应用宿主语言的行为。

通常,这种应用的使用者并不知道Lua是一种独立的语言。

例如:CGILua用户一般会认为Lua是一种用于Web的语言。

第二:作为一种独立运行的语言,Lua也是很有用的,主要用于文本处理或者只运行一次的小程序。

这种应用Lua主要使用它的标准库来实现,标准库提供模式匹配和其它一些字串处理的功能。

我们可以这样认为:Lua是文本处理领域的嵌入式语言。

第三:还有一些使用者使用其他语言开发,把Lua当作库使用。

这些人大多使用C语言开发,但使用Lua建立简单灵活易于使用的接口。

本书面向以上三类读者。

书的第一部分阐述了语言的本身,展示语言的潜在功能。

我们讲述了不同的语言结构,并用一些例子展示如何解决实际问题。

这部分既包括基本的语言的控制结构,也包括高级的迭代子和协同。

第二部分重点放在Lua特有的数据结构——tables上,讨论了数据结构、持久性、包及面向对象编程,这里我们将看到Lua的真正强大之处。

第三部分介绍标准库。

每个标准库一章:数学库、table库、string库、I/O 库、OS库、Debug库。

最后一部分介绍了Lua和C接口的API,这部分介绍在C语言中开发应用而不是Lua中,应用对于那些打算将Lua嵌入到C/C++中的读者可能会对此部分更感兴趣。

0.3 Lua的相关资源如果你真得想学一门语言,参考手册是必备的。

本书和Lua参考手册互为补充,手册仅仅描述语言本身,因此他既不会告诉你语言的数据结构也不会举例说明,但手册是Lua的权威性文档,可以得到手册的内容。

-- Lua用户社区,提供了一些第三方包和文档-- 本书的更新勘误表,代码和例子http://www.inf.puc-rio.br/~roberto/book/另外本书仅针对Lua 5.0,如果你的版本不同,请查阅Lua手册或者比较版本间的差异。

0.4 本书的体例<1> 字符串使用双引号,比如"literal strings";单字符使用单引号,比如'a';模式串也是用单引号,比如'[%w_]*'。

<2> 符号-->表示语句的输出或者表达式的结果:print(10) --> 1013 + 3 --> 16<3> 符号<-->表示等价,即对于Lua来说,用this与that没有区别。

相关文档
最新文档