LUA参考手册
罗技G系列外设宏命令编程参考文档
罗技G系列外设宏命令编程参考⽂档G-series Lua API 参考⽂档V8.50预览与概述⼿册⽬录⼿册⽬录 (2)内容预览 (3)参考⽂档 (4)标准 Lua 5.1 库 (40)附录A (41)G-series Lua API 参考⼿册是⼀套使⽤Lua脚本编程语⾔描述并且为 G-series 系列游戏键盘提供⾼级脚本功能。
该⽂档是在假设您已初步掌握Lua脚本编程语⾔使⽤⽅法的前提下进⾏的。
如果您想了解更多信息请访问 /doc/36b3d64cf4335a8102d276a20029bd64783e6296.html 。
每项G 系列的配置⽂件都有⼀个默认的Lua脚本与其绑定,并且您可以根据您的喜好随意编辑或者⾃定义。
该脚本借助并使⽤⼀个名为OnEvent的事件句柄。
⽤户可以通过检查此句柄中触发的各种事件以执⾏⽤户所希望的动作。
⽅法列表OnEvent (5)GetMKeyState (7)SetMKeyState (8)Sleep (9)OutputLogMessage (10)GetRunningTime (11)GetDate (12)ClearLog (13)PressKey (14)ReleaseKey (15)PressAndReleaseKey (16)IsModifierPressed (17)PressMouseButton (18)ReleaseMouseButton (19)PressAndReleaseMouseButton (20)IsMouseButtonPressed (21)MoveMouseTo (22)MoveMouseWheel (23)MoveMouseRelative (24)MoveMouseToVirtual (25)GetMousePosition (26)OutputLCDMessage (27)ClearLCD (28)PlayMacro (29)AbortMacro (30)IsKeyLockOn (31)SetBacklightColor (32)OutputDebugMessage (33)SetMouseDPITable (34)SetMouseDPITableIndex (35)EnablePrimaryMouseButtonEvents (36)G13 Programming (37)OnEventOnEvent() ⽅法为脚本提供了⼀系列事件句柄以⽅便⽤户对触发的事件进⾏操作,您可以使⽤以下代码实现此⽅法。
Lua 5.1 参考手册
Lua 中有八种基本类型: nil, boolean, number, string, function, userdata, thread, and table. Nil 类型只有一种值 nil ,它的主要用途用于标表识和别的任何值的差异; 通常,当需要描述一个无意义的值时会用到它。 Boolean 类型只有两种值:false 和 true。 nil 和 false 都能导致条件为假;而另外所有的值都被当作真。 Number 表示实数(双精度浮点数)。 (编译一个其它内部数字类型的 Lua 解释器是件很容易的事;比如把内部数字类型改作 单精度浮点数或长整型。参见文件 luaconf.h 。) String 表示一串字符的数组。 Lua 是 8-bit clean 的: 字符串可以包含任何 8 位字符, 包括零结束符 ('\0') (参见 §2.1)。
Lua 是一个大小写敏感的语言: and 是一个保留字,但是 And 和 AND 则是两个不同的合法的名字。 一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。
下面这些是其它的 token :
+ - * / % ^ #
== ~= <= >= < > =
( ) { } [ ]
; : , . .. ...
字符串既可以用一对单引号引起,也可以是双引号,里面还可以包含类似 C 的转义符: '\a' (响铃), '\b' (退格), '\f' (表单), '\n' (换行), '\r' (回车), '\t' (横向制表), '\v' (纵向制表), '\\' (反斜杠), '\"' (双引号), 以及 '\'' (单引号)。 而且,如果在一个反斜杠后跟了一个真正的换行符,其结果就是在字符串中产生一个换行符。 我们还可以用反斜杠加数字的形式 \ddd 来描述一个字符。这里, ddd 是一串最多三位的十进制数字。(注意,如果需要在这种描述方法后接一个是数字的字符, 那么反斜杠后必须写满三个数字。)Lua 中的字符串可以包含任何 8 位的值。包括用 '\0' 表示的零。
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极简⼊门指南(⼀):基础知识篇本⽂是《Programming in Lua 3rd》读书笔记。
Chunks⼀个 Chunk 就是⼀组被执⾏的语句,例如⼀个⽂件或者交互模式下的⼀⾏。
标识符(identifiers)我们应该避免使⽤以 _ 开头并跟上⼀个或者多个⼤写字母的字符串来作标识符,它们被保留作特殊的⽤途(例如:_VERSION)。
注释单⾏注释使⽤复制代码代码如下:--多⾏注释使⽤复制代码代码如下:--[[ 和 --]]类型简介Lua 存在的数据类型包括:1.nil。
此类型只有⼀个值 nil。
⽤于表⽰“空”值。
全局变量默认为 nil,删除⼀个已经赋值的全局变量只需要将其赋值为 nil(对⽐ JavaScript,赋值 null 并不能完全删除对象的属性,属性还存在,值为 null)2.boolean。
此类型有两个值 true 和 false。
在 Lua 中,false 和 nil 都表⽰条件假,其他值都表⽰条件真(区别于 C/C++ 等语⾔的是,0 是真)3.number。
双精浮点数(IEEE 754 标准),Lua 没有整数类型4.string。
你可以保存任意的⼆进制数据到字符串中(包括 0)。
字符串中的字符是不可以改变的(需要改变时,你只能创建⼀个新的字符串)。
获取字符串的长度,可以使⽤ # 操作符(长度操作符)。
例如:print(#”hello”)。
字符串可以使⽤单引号,也可以使⽤双引号包裹,对于多⾏的字符串还可以使⽤ [[ 和 ]] 包裹。
字符串中可以使⽤转义字符,例如 \n \r 等。
使⽤ [[ 和 ]]包裹的字符串中的转义字符不会被转义erdata。
⽤于保存任意的 C 数据。
userdata 只能⽀持赋值操作和⽐较测试6.function。
函数是第⼀类值(first-class value),我们能够像使⽤其他变量⼀样的使⽤函数(函数能够保存在变量中,可以作为参数传递给函数)7.thread。
快速入门使用Lua进行游戏脚本编程与开发
快速入门使用Lua进行游戏脚本编程与开发第一章:Lua语言简介Lua是一种轻量级的脚本语言,常用于游戏开发中的脚本编程。
它具有简洁、高效、易学易用的特点,成为了许多大型游戏引擎的首选脚本语言。
在本章中,我们将介绍Lua语言的基本概念和特点。
Lua最初由巴西里约热内卢天主教大学开发,并于1993年发布。
它是一种嵌入式语言,可以轻松集成到其他应用程序中。
Lua语言具有类似于C语言的语法,采用动态类型和自动内存管理的方式,允许开发者快速建立原型,高效地编写脚本代码。
与其他脚本语言相比,Lua的解释器非常小巧,通常只有几十KB大小,因此非常适合在资源受限的环境中使用。
同时,Lua还具备良好的跨平台性,支持各种操作系统和硬件平台。
第二章:Lua的基本语法在本章中,我们将介绍Lua语言的基本语法,包括变量、函数、控制流等。
1. 变量:Lua采用动态类型,无需显式声明变量类型。
你只需要直接给变量赋值,Lua会根据赋值的数据类型自动确定变量类型。
2. 函数:在Lua中,函数是一等公民。
你可以像操作变量一样操作函数,将其赋给变量、作为参数传递、作为返回值等。
3. 控制流:Lua支持常见的控制流语句,如条件语句(if-else)、循环语句(for、while)、跳转语句(break、return)等。
这些语句可以帮助开发者实现不同的逻辑和算法。
第三章:Lua与游戏开发在游戏开发中,Lua常常被用于编写游戏脚本和实现游戏逻辑。
在本章中,我们将介绍Lua在游戏开发中的应用场景和实践经验。
1. 游戏脚本编写:Lua可以作为一种独立的脚本语言,用于编写游戏逻辑、人工智能、关卡设计等,让游戏本身具备更高的灵活性和可扩展性。
2. 引擎扩展:许多游戏引擎都内置了Lua的解释器,开发者可以通过编写Lua脚本来扩展引擎的功能。
例如,可以使用Lua脚本编写自定义的游戏菜单、界面、特效等。
3. 快速迭代:由于Lua的语法简洁、易于学习,以及动态类型和自动内存管理的特性,使用Lua编写游戏脚本可以帮助开发者更快地进行迭代开发,快速测试和修复bug。
学会使用Lua进行游戏脚本编写
学会使用Lua进行游戏脚本编写Lua是一种轻量级的脚本语言,它被广泛用于游戏开发中。
学会使用Lua进行游戏脚本编写可以帮助开发者更加高效地创建游戏。
本文将详细介绍Lua的基本语法和常用功能,并分点列出以下内容:一、Lua的基础语法1. 变量与数据类型:Lua是一种动态类型语言,变量可以存储不同类型的数据,如数字、字符串等。
2. 注释:通过使用"--"来添加单行注释,或使用"[[]]"来添加多行注释。
3. 控制语句:包括条件判断语句(if-elseif-else)以及循环语句(for、while、repeat-until)。
4. 函数:Lua中的函数使用关键字"function"定义,可以有多个参数和返回值。
二、Lua的常用功能1. 字符串操作:Lua提供了丰富的字符串处理函数,如连接字符串、截取子串、查找子串等。
2. 数学运算:可以进行加、减、乘、除等基本的数学运算,还可以通过导入数学库来进行高级数学计算。
3. 表操作:表是一种非常重要的数据结构,在Lua中使用键值对保存数据,可以进行增删改查等操作。
4. 文件操作:可以通过Lua的文件操作函数来读取和写入文件,对于游戏中的存档和配置文件非常有用。
5. 异常处理:Lua提供了try-catch语句来处理异常情况,可以在代码执行出错时进行相应的处理。
6. 模块化:Lua支持模块化开发,可以将代码按照功能模块划分,并通过require函数进行导入和调用。
三、Lua在游戏开发中的应用1. 游戏逻辑控制:Lua可以用于编写游戏的逻辑控制部分,包括玩家操作响应、游戏进程控制等。
2. AI编写:通过使用Lua脚本编写游戏中的人工智能算法,可以让NPC、敌人等游戏角色更具智能。
3. 游戏界面设计:Lua可以与图形界面库相结合,进行游戏界面的设计和渲染,使其更加美观和交互性。
4. 游戏工具开发:Lua具有简单易学的特点,非常适合用于开发游戏中的工具,如地图编辑器、关卡设计等。
lua语言中表的格式-概述说明以及解释
lua语言中表的格式-范文模板及概述示例1:在Lua语言中,表是一种非常重要的数据结构,被广泛用于存储和操作数据。
表是一个关联数组,可以使用任意类型的值作为索引。
Lua中的表是一种无序的集合,可以包含任意类型的值作为键和值。
表的创建可以通过花括号{}来实现,例如:local myTable = {}上述代码创建了一个名为myTable的表。
这个表是一个空表,还没有包含任何键值对。
在Lua中,表的键和值之间使用等号=进行关联。
键和值可以是任意的Lua数据类型,例如:local myTable = {name = "John",age = 25,isStudent = true}上述代码创建了一个名为myTable的表,包含了三个键值对。
其中,name是键,"John"是值;age是键,25是值;isStudent是键,true是值。
表中的键和值可以通过索引来访问。
可以使用点号.或者方括号[]来访问表中的键值对,例如:print() 输出: Johnprint(myTable["age"]) 输出: 25在Lua中,表是一种动态的数据结构,可以根据需要随时修改和扩展。
可以通过赋值操作来修改表中的键值对,例如: = "Mike" 修改键name的值为"Mike"myTable.isStudent = false 修改键isStudent的值为false表还可以包含另一个表作为值,形成嵌套的表结构。
例如:local myTable = {name = "John",contact = {phone = "1234567890",email = "john@example"}}上述代码创建了一个名为myTable的表,其中contact是一个嵌套的表。
Lua脚本语法说明(修订)
Lua脚本语法说明(修订)Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法⽐较简单,学习起来也⽐较省⼒,但功能却并不弱。
所以,我只简单的归纳⼀下Lua的⼀些语法规则,使⽤起来⽅便好查就可以了。
估计看完了,就懂得怎么写Lua程序了。
在Lua中,⼀切都是变量,除了关键字。
I. ⾸先是注释 写⼀个程序,总是少不了注释的。
在Lua中,你可以使⽤单⾏注释和多⾏注释。
单⾏注释中,连续两个减号"--"表⽰注释的开始,⼀直延续到⾏末为⽌。
相当于C++语⾔中的"//"。
多⾏注释中,由"--[["表⽰注释开始,并且⼀直延续到"]]"为⽌。
这种注释相当于C语⾔中的"/*...*/"。
在注释当中,"[["和"]]"是可以嵌套的(在lua5.1中,中括号中间是可以加若⼲个"="号的,如 [==[ ... ]==]),见下⾯的字符串表⽰说明。
II. Lua编程 经典的"Hello world"的程序总是被⽤来开始介绍⼀种语⾔。
在Lua中,写⼀个这样的程序很简单: print("Hello world") 在Lua中,语句之间可以⽤分号";"隔开,也可以⽤空⽩隔开。
⼀般来说,如果多个语句写在同⼀⾏的话,建议总是⽤分号隔开。
Lua 有好⼏种程序控制语句,如:控制语句格式⽰例If if 条件 then ... elseif 条件 then ... else ... end if 1+1=2 then print("true") elseif 1+2~=3 then print("true") else print("false") endWhile while 条件 do ... end while 1+1~=2 do print("true") endRepeat repeat ... until 条件repeat print("Hello") until1+1~=2For for 变量=初值, 终点值, 步进 do ... end for i = 1, 10, 2 do print(i) endFor for 变量1, 变量2, ... 变量n in 表或枚举函数 do ... end for a,b in mylist do print(a, b) end 注意⼀下,for的循环变量总是只作⽤于for的局部变量;当省略步进值时,for循环会使⽤1作为步进值。
DE-4000系列可配置安全停止和控制系统脚本参考手册说明书
Scripting Reference ManualDE-4000 Series Configurable Safety Shutdown and Control System Form DE-4000 SRM 06-20DE-4000 SCRIPTING REFERENCE MANUALOne overarching capability that allows a bridge to gap the standard needs of everyday systems and the customer needs of innovation is scripting. A scripting language, cleverly named Lua, is embedded into the DE-4000 system. It operates as a script mainly meaning that it does not need additional tools to convert the “code” into machine language. It also is looked at and corrected for errors every time the script runs. Therefore it is an “interpreted” language and runs all of the time when you ask it. Lua comes with a background of being robust, fast, and geared towards embedded applications, with a proven track record in the gaming industry. For the DE-4000 system it is small and fits in the memory we have available, holds a lot of power, and keeps it simple for writing in the language.All information regarding the Lua scripting language is located at https:// Using the Lua engine as an embedded tool allows for taking advantage of a full architecture and standard at your fingertips. Within the language there are all ofthe normal attributes to programming such as functions, variables, statements, expressions etc. All of this reference material can be found at https:/// manual/5.3/For getting started and using a guided reference, there are several editions of “Programming in Lua” available. Most recent editions are a paid for product that come in paper back or ebook form. While testing out Lua and becoming familiar, a free first edition is available and covers a lot of learning needs to get comfortable with the language. It can be located at https:///pil/contents.html.A major advantage to using Lua is its inherent ability to allow custom functions. While all normal functions and calls are published, there is the ability to add new functions in the DE-4000 firmware. Once new functions are defined and have calls to their internal properties, they then can be published for the user. This includes functions such as our flexible Modbus table and talking with various terminal boards linked in the system. Below is the start to the list of Altronic based functions. As functionality and features come to life through new ideas, this document will continually get updated with the latest scripts that we make available.GETTING STARTED WITH DE-4000 SCRIPTSBasic Scripting on DE-40001. Begin on Dashboard on DE-4000 system environment2. Choose “Global” from menu on left side of screen3. In the Sub-Menu on the Left side select “Scripts”4. Select one of the page icons under one of the 4 script options to open editor5. Scripting can be entered into the editor.Scripting Windows and examples• Master ScriptThe Master Script section is the Primary scripting environment.Primary scripting functions can be written in this section.Exampl e:local suction = get_channel_val(1,1)local discharge1 = get_channel_val(1,3)diff = discharge1 - suctionset_sVirt(“Difference”,diff)The first line gets the channel value from Terminal board 1 Input 1 and stores it in local variable named suction.The second line gets the channel value from Terminal board 1 Input 3 and stores it in local variable named discharge1.The third line takes the discharge1 pressure and subtracts the suction pressure and stores it in the global variable named diff (NOTE: Any value that you want to access from another scripting section must be stored in a global variable. This is used most in calling values into Modbus registers as explained below).The fourth line copies the value from diff and stores it into the Virtual statuschannel named “Difference” This channel can be displayed on the Dashboard.• Control ScriptThe Control Script section is used to override the default controlstrategy found on the Global/Control page. A copy of the defaultcontrol script (found in attached appendix) can be copied into thissection and then modified to change the control functionality as wellas add additional control loops beyond the default 2.• Modbus ScriptThe Modbus Script section is used to move data into and out ofModbus registersdefaultModbus()set_modbus(300,diff)The first line pulls in the factory set Modbus mappingThe second line moves the value from the global variable named diff into the 40300 Modbus RegisterCUSTOM FUNCTIONS FOR SCRIPTINGcreate_param(“index”,default,”category”,”description”)Create a user configurable parameterParameter is stored as “index”Default value (if not changed by user) is defaultParameters will be grouped on the global/params page by categoryDescription is text to describe the parameter to the usere:Examplcreate_param(“numengcyl”,8,”engine params”,”num. of engine cylinders”) Related function(s): get_param()get_channel_label(terminal,channel)Return the label for the input channel defined by terminal, channele:Exampl-- Read channel label for terminal 1, channel 7local chanLabel = get_channel_label(1,7)get_channel_long_label(terminal,channel)Return the channel label, but leave off the short label if definedNote: A channel can be assigned a short label in the DE-4000 channel configuration page. The short label is defined at the end of the channel label and is enclosed in parentheses.For a suction pressure channel you would define the channel label as: Suction Pressure (SP)In this case the channel short label is SPThis function will return the long label defined above as Suction PressureExample:-- Read channel long label for terminal 1, channel 7local shortLabel = get_channel_short_label(1,7)-- Returns “Suction Pressure”get_channel_short_label(terminal,channel)Return the short label for a channel if defined, otherwise return the channel hashNote: A channel can be assigned a short label in the DE-4000 channel configuration page.The short label is defined at the end of the channel label and is enclosed in parentheses.For a suction pressure channel you would define the channel label as: Suction Pressure (SP)In this case the channel short label is SPIf the channel short label is not defined the channel hash will be returned. For example, the channel hashfor Terminal 1, Input channel 12 is T1:IN12e:Exampl-- Read channel short label for terminal 1, channel 7local shortLabel = get_channel_short_label(1,7)-- Returns “SP”get_channel_val(terminal,channel)Returns current value of analog input channel on terminal module terminalReturn value type is numericExample: (reads value of Suction Pressure from terminal module #1, IN5)local sp = get_channel_val(1,5)get_gbl(“index”,default)Return global config setting stored under index or return default if not definedNote: get_gbl is used to retrieve global CONFIGURATION settings that are typically set when the system is configured and do not change as the system is running.If you want to set and retrieve global STATUS variables use the get_sGbl() and set_sGbl() functions. If you want to create and read virtual channels use the set_sVirt() and get_sVirt() functions.Example: (get the number of terminal boards installed in the system)local nt = get_gbl(“NumTerm”,1)get_modbus(register)Return the value stored in a 40000 block Modbus registerNote: This function returns values from the 40000 block of registers. In other words, passing the value of 250 into this function will return the value stored at Modbus register 40250Example:local regVal = get_modbus(250)set_sVirt(“Reg40250”,regVal) --create virtual channel with--value from register 40250Related function(s): set_modbus()get_param(“index”)Return either the default value or the user configured value of the parameter indexExample: (get the configured parameter for number of engine cylinders)get_param(“NumEngCyl”)Related function(s): create_param()get_rpm(channel)Reads the RPM input channel in units of revolutions per minuteNote: valid channel numbers are 1 – 10 (2 channels each per 5 possible Terminal Modules)Each Terminal Module has 2 RPM inputs (RPM1 and RPM2)Terminal Module #1 RPM channels are 1,2Terminal Module #2 RPM channels are 3,4Terminal Module #3 RPM channels are 5,6Terminal Module #4 RPM channels are 7,8Terminal Module #5 RPM channels are 9,10Example: (read RPM1 channel on Terminal Module #1and RPM2 channel on Terminal Module #3)local engineRPM = get_rpm(1)local turbuRPM = get_rpm(6)get_sGbl(“index”,{default})If “index” is defined in the global status table, returns the value associated with “index”If “index” is not defined and optional {default} is provided then returns {default}Note: It is recommended to always provide a default value when using this functionExample: (get the previously stored value “calculatedPressure”, return 0 if not found)local cp = get_sGbl(“calculatedPressure”,0)Related function(s): set_sGbl()get_state()Return the current engine state (possible values are currently 0 - 10)Example:local engineState = get_state()if engineState > 7 thenset_timer(“WarmupTimer”,1000)endget_sVirt(“index”,default)Returns the value of virtual channel index or returns default if the virtual channel does not existExample: (get the value of the virtual channel ElapsedTime and set value of status global “timeExceeded” if ElapsedTime is greater then status global “timeLimit”)local tl = get_sGbl(“timeLimit”)local et = get_sVirt(“ElapsedTime”,0)if et > tl thenset_sGbl(“timeExceeded”,true)elseset_sGbl(“timeExceeded”,false)endRelated function(s): set_sVirt()get_time()Return the Unix “epoch” time (defined as number of seconds elapsed since Jan 1, 1970)Note: you can measure elapsed time by storing a get_time() value at one event and later reading the current get_time() and then subtract the first time from the second timeExample: (store current time if first time through, otherwise calculate elapsed time)local startTime = get_sGbl(“startTime”,0)if startTime ==0thenlocal currentTime = get_time()startTime = currentTimeset_sGbl(“startTime”,currentTime)endlocal et = get_time()- startTimeset_sVirt(“ElapsedTime”,et)get_timer(“index”)Returns 1 or 2 valuesFirst return value (boolean) is true if timer is active(counting down) or false if timer is expired or false if time has not been set Second return value is number of seconds remaining or -1 if timer is not active or -1 if timer has not been setExample: (if timer is expired, then set global status “timedOut” to true)if not get_timer(“myTimer”)thenset_sGbl(“timedOut”,true)elseset_sGbl(“timedOut”,false)ende: (set virtual channel to show number of remaining seconds)Exampllocal active,remaining = get_timer(“myTimer”)if not active thenset_sVirt(“timeRemaining”,”Expired”)elseset_sGbl(“timeRemaining”,remaining)endRelated function(s): set_timer()RandomVariable(length)Create a string composed of random alpha/numeric text. The length of the returned string is passed in as length e:Exampl-- get a random string 10 characters longlocal randomText = RandomVariable(10)-- returns a random string such as “AIqbFfzQ68”set_modbus(register,value)Set a value into a 40000 block Modbus registerNote: This function sets values into the 40000 block of registers. In other words, passing the register parameter of 250 into this function will set the value stored at Modbus register 40250Example:-- Read channel value at Terminal 1, channel 5 and write-- to Modbus register 40250local chanVal = get_channel_val(1,5)set_modbus(250,chanVal)Related function(s): get_modbus()set_sGbl(“index”,value)Store value in the global status table under “index”Value can be a number or a string but if storing a boolean, use tostring()Example: (store boolean value “minPressureExceeded”)local mpe =falselocal sp = get_channel_val(1,5)if sp >15thenmpe =trueendset_sGbl(“minPressureExceeded”,tostring(mpe))Related function(s): get_sGbl()set_sVirt(“index”,value)Sets a virtual status channel with channel name indexNote: once you create a virtual channel, you can add that channel to the dashboard using the channel name index Example: (calculate differential between suction and discharge pressure and assign to virtual channel)local sp = get_channel_val(1,5) --suction pressurelocal dp = get_channel_val(1,6)--discharge pressurelocal diffPress = dp - spset_sVirt(“SuctDischDiff”,diffPress)Related function(s): get_sVirt()set_timer(“index”,secs)Activate timer “index” and set countdown time to secsExample: (create timer “myTimer” and start countdown time at 300 seconds)set_timer(“myTimer”,300)Related function(s): get_timer()APPENDIX:DEFAULT CONTROL LOOP SCRIPT:local rampRate1=get_gbl(“rampRate1”,0.8)local rampRate2=get_gbl(“rampRate2”,0.8)local dischTerm=tonumber_def(get_gbl(“spDischTerm”,0),0)local dischChan=tonumber_def(get_gbl(“spDischChan”,0),0)local suctTerm=tonumber_def(get_gbl(“spSuctTerm”,0),0)local suctChan=tonumber_def(get_gbl(“spSuctChan”,0),0)local suctMin=tonumber_def(get_gbl(“suctMin”,0),0)local recycleMin=tonumber_def(get_gbl(“recycleMin”,0),0)local recycleMax=tonumber_def(get_gbl(“recycleMax”,0),0)local suctSp=tonumber_def(get_gbl(“suctSp”,0),0)local dischMax=tonumber_def(get_gbl(“dischMax”,0),0)local dischSp=tonumber_def(get_gbl(“dischSp”,0),0)local outputTerm=tonumber_def(get_gbl(“outputTerm”,0),0)local outputChan = tonumber_def(get_gbl(“outputChan”,0),0)local recycleTerm = tonumber_def(get_gbl(“outputTerm2”,0),0)local recycleChan=tonumber_def(get_gbl(“outputChan2”,0),0)local speedRevAct = tonumber_def(get_gbl(“speedRevAct”,0),0)local recycleRevAct = tonumber_def(get_gbl(“recycleRevAct”,0),0) local outputLow = tonumber_def(get_gbl(“outputLow”,0),0)local outputLow2 = tonumber_def(get_gbl(“outputLow2”,0),0)local outputHigh = tonumber_def(get_gbl(“outputHigh”,0),0)local outputHigh2 = tonumber_def(get_gbl(“outputHigh2”,0),0)local spSuctType = get_gbl(“spSuctType”,”linear”)local spDischType = get_gbl(“spDischType”,”linear”)local suctPIDPFactor = tonumber_def(get_gbl(“suctPIDPFactor”,0),0) local suctPIDIFactor = tonumber_def(get_gbl(“suctPIDIFactor”,0),0) local suctPIDDFactor = tonumber_def(get_gbl(“suctPIDDFactor”,0),0) local dischPIDPFactor = tonumber_def(get_gbl(“dischPIDPFactor”,0),0) local dischPIDIFactor=tonumber_def(get_gbl(“dischPIDIFactor”,0),0) local dischPIDDFactor=tonumber_def(get_gbl(“dischPIDDFactor”,0),0) local recycleCtrl=falselocal recycleSuctionRev=falselocal recycleDischargeRev=falseif recycleChan>0 and recycleTerm>0thenrecycleCtrl=trueend--if recycleCtrl and spSuctType == “linear” and outputLow2 > suctSp then -- recycleSuctionRev = true--end--if recycleCtrl and spDischType == “linear” and recycleMax < dischSp then -- recycleDischargeRev = true--end--print(“disch: “..tostring(disch)..” suct:”..tostring(suct))--local suct = 500local dischPct=100local suctPct=100local dischOutput=0local suctOutput = 0local rSuctOutput = 0local rDischOutput = 0local minLoad = 0local maxLoad = 100local minRecycle = 0local maxRecycle = 100local speedTarget=get_sGbl(“speedTarget”,0)local recycleTarget=get_sGbl(“recycleTarget”,0)function map_range(rangeLow,rangeHigh,input)if input<=rangeLow and input<=rangeHigh thenreturn0endif input>=rangeLow and input>=rangeHigh thenreturn100endlocal rangeDiff=math.abs(rangeLow-rangeHigh)local min = math.min(rangeLow,rangeHigh)local retval=math.abs(input-min) /rangeDiff*100 if retval>100then retval=100endif retval<0then retval=0endreturn retvalendlocal suct= falselocal suctVal=0if tonumber_def(get_gbl(“spSuctEn”,0),0)==1thenif suctTerm>0and suctChan>0thensuctVal=get_channel_val(suctTerm,suctChan)suct=trueendendif suct thenif spSuctType ==“linear”thenlocal suctDiff = suctSp - suctMinif suctDiff == 0 then suctDiff = 1 endif suctVal < suctSp thenlocal suctErr = suctSp - suctValsuctPct = suctErr / suctDiffif suctPct > 1 then suctPct = 1 endif suctPct < 0 then suctPct = 0 endsuctOutput =(1 - suctPct)* 100elsesuctOutput = 100endelseset_gbl(“PIDsuctEnable”,1)set_gbl(“PIDsuctPFactor”,suctPIDPFactor)set_gbl(“PIDsuctIFactor”,suctPIDIFactor)set_gbl(“PIDsuctDFactor”,suctPIDDFactor)set_gbl(“PIDsuctSp”,suctSp)set_gbl(“PIDsuctDeadband”,0.2)local suctPidOutput = doPid(“suct”,suctVal)suctOutput = suctPidOutputendelsesuctOutput = 100endlocal disch =falselocal dischVal = 0if tonumber_def(get_gbl(“spDischEn”,0),0) == 1 thenif dischTerm > 0 and dischChan > 0 thendischVal = get_channel_val(dischTerm,dischChan) disch =trueendendif disch thenif spDischType ==“linear”thenlocal dischDiff = dischMax - dischSpif dischDiff == 0 then dischDiff = 1 endif dischVal > dischSp thenlocal dischErr = dischVal - dischSpdischPct = dischErr / dischDiffif dischPct > 1 then dischPct = 1 endif dischPct < 0 then dischPct = 0 enddischOutput =(1 - dischPct)* 100elsedischOutput = 100endelseset_gbl(“PIDdischEnable”,1)set_gbl(“PIDdischPFactor”,dischPIDPFactor)set_gbl(“PIDdischIFactor”,dischPIDIFactor)set_gbl(“PIDdischDFactor”,dischPIDDFactor)set_gbl(“PIDdischSp”,dischSp)set_gbl(“PIDdischRevAct”,1)set_gbl(“PIDdischDeadband”,0.2)local dischPidOutput = doPid(“disch”,dischVal)dischOutput = dischPidOutputendelsedischOutput = 100end--print(“suctOutput dischOutput: “..math.floor(suctOutput)..” “..math. floor(dischOutput))local minOutput = 100local winning = 0if suctOutput < minOutput thenminOutput = suctOutputwinning = 1endif dischOutput < minOutput thenminOutput = dischOutputwinning = 2endif suctOutput == dischOutput thenwinning = 0endif winning == 0 thenset_gbl(“PIDsuctMax”,100)set_gbl(“PIDdischMax”,100)endif winning == 1 thenset_gbl(“PIDdischMax”,math.min(suctOutput + 2,100))set_gbl(“integraldisch”,0)set_gbl(“lastErrdisch”,0)set_gbl(“outputSumdisch”,0)set_gbl(“PIDsuctMax”,100)endif winning == 2 thenset_gbl(“PIDsuctMax”,math.min(dischOutput + 2,100))set_gbl(“integralsuct”,0)set_gbl(“lastErrsuct”,0)set_gbl(“outputSumsuct”,0)set_gbl(“PIDdischMax”,100)endlocal recycleMinOutput = minOutputlocal manOutput = 0--******************************************************************** local manMode = 0local manTerm = tonumber_def(get_gbl(“manTerm”,0),0)local manChan = tonumber_def(get_gbl(“manChan”,0),0)if manTerm > 0 and manChan > 0 thenlocal manInput = get_channel_val(manTerm,manChan)if manInput > 0.5 thenmanMode = 0set_sVirt(“SpeedControl”,”Auto”)elsemanMode = 1set_sVirt(“SpeedControl”,”Manual”)endelseif get_sVirt(“SpeedControl”,”Auto”) == “Auto”thenmanMode = 0elsemanMode = 1endend--[[local idleSpeed = get_gbl(“idleSpeed”,0)local lowSpeed = get_gbl(“lowSpeed”,0)local highSpeed = get_gbl(“highSpeed”,0)local speedPct = 0if st> highSpeed then st= highSpeed endif st< lowSpeed then st = lowSpeed endif get_state() ~= 8 then--st= idleSpeedendset_sVirt(“SpeedTarget”,st)speedPct =(st - lowSpeed) /(highSpeed - lowSpeed) * 100if speedPct < 0 then speedPct = 0 endif speedPct > 100 then speedPct = 100 endst = speedPctif idleSpeed < lowSpeed thenlocal speedRpm = speedPct / 100 * (highSpeed - lowSpeed) + lowSpeed st = (speedRpm - idleSpeed) / (highSpeed - idleSpeed) * 100 --st =(st - idleSpeed) / (highSpeed - idleSpeed) * 100end]]----if manMode == 1 and get_state() == 8 thenlocal manSpeed = get_sVirt(“ManualSpeed”,0)local idleSpeed = get_gbl(“idleSpeed”,0)local lowSpeed = get_gbl(“lowSpeed”,0)local highSpeed = get_gbl(“highSpeed”,0)local maxSpeed = get_gbl(“maxSpeed”,0)local diff = highSpeed - lowSpeedif diff < 0 then diff = 0 endlocal maxDiff = maxSpeed - idleSpeedif maxDiff < 0 then maxDiff = 0 endif get_sVirt(“speedBump”,0) ~= 0 thenlocal si= get_gbl(“SpeedIncrement”,0)local sip = get_param(“SpeedIncrement”,0)if sip ~= 0 then si = sip endmanSpeed = manSpeed +(si * get_sVirt(“speedBump”,0)) set_sVirt(“speedBump”,0)endif get_sVirt(“AutoManBump”,0) > 0 thenset_sVirt(“SpeedControl”,”Auto”)set_sVirt(“AutoManBump”,0)endif get_sVirt(“AutoManBump”,0) < 0 thenset_sVirt(“SpeedControl”,”Manual”)set_sVirt(“AutoManBump”,0)endif manMode == 1 thenlocal manSpeedTerm = tonumber_def(get_gbl(“manSpeedTerm”,0),0)local manSpeedChan = tonumber_def(get_gbl(“manSpeedChan”,0),0)if manSpeedTerm > 0 and manSpeedChan > 0 then--*** USE SPEED PCT TO SET SPEEDlocal speedInput = tonumber(get_channel_val(manSpeedTerm,manSpeedChan)) local speedPct =(speedInput / 5) * 100if speedPct > 100kl then speedPct = 100 endif speedPct < 0 then speedPct = 0 endmanOutput = speedPctmanSpeed =math.floor((speedPct / 100) * diff + lowSpeed + 0.5) else-- Use ManualSpeed to set speedmanOutput = ((manSpeed - lowSpeed) / diff) * 100.0if manOutput < 0 then manOutput = 0 endif manOutput > 100 then manOutput = 100 endendminOutput = manOutputelse--speedTarget =local stRpm =(speedTarget/100) * maxDiff + idleSpeedif stRpm < lowSpeed then stRpm = lowSpeed endif stRpm > highSpeed then stRpm = highSpeed endmanSpeed =math.floor(stRpm)end--speedTarget = get_sGbl(“speedTarget”,0)if manSpeed < lowSpeed thenmanSpeed = lowSpeedendif manSpeed > highSpeed thenmanSpeed = highSpeedendset_sVirt(“ManualSpeed”,manSpeed)--******************************************************************** local output1 = 0local output2 = 0if spSuctType ==“pid”or spDischType ==“pid”then--Map minOutput to output1output1 = map_range(outputLow,outputHigh,minOutput)set_sVirt(“out1”,output1)--Map minOutput to ourput2output2 = map_range(outputLow2,outputHigh2,recycleMinOutput)set_sVirt(“out2”,output2)local hasRPM = idleSpeed > 0 and lowSpeed > 0 and highSpeed > 0 and max-Speed > 0if outputTerm and outputChan thenif hasRPM thenlocal speedRpm = output1 / 100 *(highSpeed - lowSpeed) + lowSpeed--set_ao_val(outputTerm,outputChan,(speedRpm - idleSpeed) / (maxSpeed - idleSpeed) * 100)speedTarget = (speedRpm - idleSpeed) / (maxSpeed - idleSpeed) * 100 else--set_ao_val(outputTerm,outputChan,output1)speedTarget = output1endendif recycleTerm and recycleChan thenset_ao_val(recycleTerm,recycleChan,output2)endif get_state()== 9 thenspeedTarget = get_sGbl(“speedTarget”,0)if speedTarget > 0 then speedTarget = speedTarget - rampRate1 end if speedTarget < 0 then speedTarget = 0 endendif get_state()< 8 then speedTarget = 0 endset_sGbl(“speedTarget”,speedTarget)--set_sGbl(“a”..outputChan,speedTarget)set_ao_val(outputTerm,outputChan,speedTarget)--set_ao_val(outputChan,speedTarget)--print(suctOutput..” “..dischOutput..” “..speedTarget)set_sVirt(“spTarget”,speedTarget)--set_speed_val(1,speedTarget)if hasRPM thenlocal sRpm =(speedTarget/100)* maxDiff + idleSpeedset_sVirt(“Speed Target”,math.floor(sRpm + 0.5))endelse-- Remember that minOutput is 0 - 100 pct of lowSpeed <-> highSpeed -- We need to convert this to 0 - 100 pct of idleSpeed <-> maxSpeed local suctPct = map_range(outputLow,outputHigh,minOutput)local speedRpm = suctPct / 100 *(highSpeed - lowSpeed) + lowSpeed minOutput =(speedRpm - idleSpeed) /(maxSpeed - idleSpeed) * 100if minOutput <= speedTarget thenspeedTarget = speedTarget - rampRate1if speedTarget < minOutput then speedTarget = minOutput endelsespeedTarget = speedTarget + rampRate1if speedTarget > minOutput then speedTarget = minOutput endif speedTarget > maxLoad then speedTarget = maxLoad end endif speedTarget > maxLoad then speedTarget = maxLoad endif speedTarget < minLoad then speedTarget = minLoad endif recycleCtrl thenlocal recyclePct = map_range(outputLow2,outputHigh2,recycleMinOutput) --if recycleRevAct == 1 then recyclePct = 100 - recyclePct endif recyclePct <= recycleTarget thenrecycleTarget = recycleTarget - rampRate2if recycleTarget < recyclePct then recycleTarget = recyclePct endelserecycleTarget = recycleTarget + rampRate2if recycleTarget > recyclePct then recycleTarget = recyclePct endendif recycleTarget > maxRecycle then recycleTarget = maxRecycle endif recycleTarget < minRecycle then recycleTarget = minRecycle endlocal recycleOutput = recycleTargetif get_state() < 8 thenrecycleTarget = 0endif recycleRevAct == 1 thenrecycleOutput = 100 - recycleOutputend--set_sGbl(“a”..recycleChan,recycleOutput)set_ao_val(recycleTerm,recycleChan,recycleOutput)set_sGbl(“recycleTarget”,recycleTarget)set_sVirt(“recycleTarget”,recycleTarget)endif get_state() == 9 thenspeedTarget = get_sGbl(“speedTarget”,0)if speedTarget > 0 then speedTarget = speedTarget - rampRate1 end if speedTarget < 0 then speedTarget = 0 endendif get_state() < 8 then speedTarget = 0 endset_sGbl(“speedTarget”,speedTarget)--set_sGbl(“a”..outputChan,speedTarget)set_ao_val(outputTerm,outputChan,speedTarget)--set_ao_val(outputChan,speedTarget)--print(suctOutput..” “..dischOutput..” “..speedTarget)set_sVirt(“spTarget”,speedTarget)--set_speed_val(1,speedTarget)local sRpm =(speedTarget/100) * maxDiff + idleSpeedset_sVirt(“Speed Target”,math.floor(sRpm + 0.5))end。
Lua脚本语法说明
Lua脚本语法说明(修订)Lua脚本语法说明(增加lua5.1部份特性)Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱。
所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了。
估计看完了,就懂得怎么写Lua程序了。
在Lua中,一切都是变量,除了关键字。
I. 首先是注释写一个程序,总是少不了注释的。
在Lua中,你可以使用单行注释和多行注释。
单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。
相当于C++语言中的"//"。
多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。
这种注释相当于C语言中的"/*...*/"。
在注释当中,"[["和"]]"是可以嵌套的(在lua5.1中,中括号中间是可以加若干个"="号的,如[==[ ... ]==]),见下面的字符串表示说明。
II. Lua编程经典的"Hello world"的程序总是被用来开始介绍一种语言。
在Lua中,写一个这样的程序很简单:print("Hello world")在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开。
一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。
Lua 有好几种程序控制语句,如:注意一下,for的循环变量总是只作用于for的局部变量;当省略步进值时,for循环会使用1作为步进值。
使用break可以用来中止一个循环。
相对C语言来说,Lua有几个地方是明显不同的,所以面要特别注意一下:.语句块语句块在C中是用"{"和"}"括起来的,在Lua中,它是用do 和end 括起来的。
比如:do print("Hello") end可以在函数中和语句块中定局部变量。
lua语法
lua语法Lua 学习起来非常简单,我们可以创建lua语法 1!lua语法 1交互式编程Lua 提供了交互式编程模式。
我们可以在命令行中输入程序并立即查看效果。
Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:$ lua -i$ Lua 5.3.0 Copyright (C) 1994-2015 Lua, PUC-Rio>在命令行中,输入以下命令:> print("Hello World!")接着我们按下回车键,输出结果如下:> print("Hello World!")Hello World!>脚本式编程我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为hello.lua 的脚本文件中:print("Hello World!")print("")使用 lua 名执行以上脚本,输出结果为:$ lua test.luaHello World!我们也可以将代码修改为如下形式来执行脚本(在开头添加:#!/usr/local/bin/lua):#!/usr/local/bin/luaprint("Hello World!")print("")以上代码中,我们指定了 Lua 的解释器 /usr/local/bin directory。
加上 # 号标记解释器会忽略它。
接下来我们为脚本添加可执行权限,并执行:./test.luaHello World!注释单行注释两个减号是单行注释:--多行注释--[[多行注释多行注释--]]标示符Lua 标示符用于定义一个变量,函数获取其他用户定义的项。
标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。
lua简单入门
lua简单⼊门⼀、安装windows下的lua环境,luaforwindows下载最新的5.3版本,下载地址:也可以在gitlab下载:下载解压lua53.exe就是lua语⾔解释器按住shift⿏标右键,此处打开命令窗⼝编写⼀个简单的hello world程序test.lua如果觉得简单,可以给⼀个for循环,打印1~10正常执⾏,说明lua环境安装没有问题⼆.lua语⾔的基本语法1. lua的值和类型数值:1,2,31.2 3.14字符类型"hello world"Table类型--lua的table,不需要预定义长度,保证数组在⾸次赋值的时候在最⼤索引加1--没有类型限制--下标从1开始,⾃动扩容--table = 数组+映射--第⼀种写法a={}a[1]=10a[2]=20a[3]="hello"print(a[1],a[2],a[3])a={10,20,"hello"}print(a[1],a[2],a[3])-- 映射的另外写法a = {}a["hello"]=2a[3]=falseprint(a.hello, a[3])--别的写法a={["hello"]=2,[3]=false,}print(a.hello,a[3])1. lua的函数-- 加法函数function add(a,b)return a+b end--调⽤函数print(add(1,2))--调⽤函数不同的写法function add(a,b)return a+b enda = add(1,2)print(a)add = function(a,b)return a+bendfoo =addprint(foo(1,2))--函数返回多个值,返回加法和减法function add(a,b)return a+b,a-bendprint(add(1,2))1. lua中多变量的赋值a,b = 1,2print(a,b)--交换变量a,b = b,a-- 默认值为nila,b = 1-- 多余的值会忽略a,b = 1,2,31. lua的表达式a= 1 + 1print(a)a=1b=2print((b+2)*3)c = 1c = c + 1print(c)5. lua的逻辑表达式--and 两个都为true,返回true,否则返回false--or 任意⼀个为true,返回true--not 取反print(true and false)6. lua拼接字符串,使⽤两个点号 ..print("hello".." world")7. --lua变量的范围-- 全局变量function foo()a = 1 -- 全局变量endfoo()print(a) -- 为1-- 局部变量⼀般使⽤local关键字修饰,我们在lua开发中应该尽量使⽤local局部变量function foo()local a = 1 -- 局部变量,local为作⽤域控制关键词,分隔开,利于阅读,还有优化作⽤endfoo()print(a) -- 为nil8. lua的流程控制,判断和循环-- ⽼段⼦:⽼婆,包⼦和西⽠-- ⽼婆打电话给程序员⽼公打了个电话:下班顺路买⼀⽄包⼦回来,如果看到卖西⽠的就买⼀个-- 当天晚上回来程序员带回来⼀个包⼦,⽼婆怒道:你怎么就买了⼀个包⼦,程序员:因为我看到了卖西⽠的啊-- 当看到卖西⽠的就买⼀个包⼦,没有看到卖西⽠的就买1公⽄包⼦if foundWatermelon() thenbuy("baozi","1")elsebuy("baozi","1kg")enda.while循环,循环打印0-9local i = 0while i < 10 doprint(i)i = i + 1end--lua的for数值遍历--for (int i = 0;i < 10; i ++)--{-- printf("%d\n",i);--}--打印1到10for i = 1,10 doprint(i)end--等价于for i = 1,10,1 doprint(i)end-- 倒叙打印for i = 10,1,-1 doprint(i)endb. lua的for泛型遍历for的泛型遍历: pairs() ipairs() 迭代器-- pairs是内部的函数,功能就是可以把⼀个table⾥⾯的所有部分全部遍历a= {["foo"]=1,[100]=true,[1]=20,[2]=30,}for k,v in pairs(a) doprint(k,v)end-- ipairs 功能变化了,只遍历数组部分a= {["foo"]=1,[100]=true,[1]=20,[2]=30,}for k,v in ipairs(a) doprint(k,v)end三、lua的包管理-- lua的包(package)local c = require("foo") -- 作为⽂件名搜索,默认搜索当前⽬录print(c)print(c.foo(1,2))-- foo.lua 的代码local class={}function class.foo(a,b)return a + bend-- 另外的写法,class的映射:class.foo,foo键的值为⼀个函数--class.foo = function (a,b)-- return a + b--end-- lua的⼀个特点,可以把全局代码当做⼀个值返回return class-- 美化后local socket = require("foo") -- 作为⽂件名搜索,默认搜索当前⽬录print(socket)print(socket.send(1,2))-- fooo.lualocal class={}function class.send(a,b)return a + bend-- 另外的写法,class的映射:class.foo,foo键的值为⼀个函数--class.foo = function (a,b)-- return a + b--end-- lua的⼀个特点,可以把全局代码当做⼀个值返回return class-- require 加载⽂件,运⾏,推荐使⽤-- dofile --加载并运⾏,可以多次加载,⽼的写法-- lua从5.3 以后没有dostring功能了print("require")for i = 1,2 doprint(require("foo"))endfor i = 1,2 doprint(dofile("foo.lua"))end-- 运⾏结果E:\software\lua5.3>lua53.exe test.lua requiretable: 008182a8 -- table相同,表⽰同⼀个table: 008182a8dofiletable: 00817c68table: 0081e350lua的系统库-- 批量插⼊table键值local t = {}for i = 1,10 dotable.insert(t,i)endfor k,v in pairs(t) doprint(k, v)endprint(t)-- 删除数组中的元素table.remove(t,2)-- 循环打印table 结果:for k,v in pairs(table) doprint(k, v)endE:\software\lua5.3>lua53.exe test.luamove function: 69e96240sort function: 69e96ee0insert function: 69e96720remove function: 69e96550concat function: 69e96890unpack function: 69e95e30pack function: 69e95fa0--删除元素的另外写法local t = {}t.a = 1t.b = 2-- 删除⼀个值t.a = nilfor k,v in pairs(t) doprint(k, v)end获取lua中对象的长度-- # 可以获取对象的长度,对象⼀般指的就是字符串和tablelocal t = {5, 1 ,3 ,4, 12}local s = "hello world"-- 得到table的长度print(#t)-- 取字符串的长度print(#s)-- type获取类型print(type(s))-- 字符转换为数字local a = tonumber("3.14")-- 数字转换为数字local b = tostring(3.14)print(b, type(b))-- string.format 把⼀个字符串按照格式构造出来print(string.format("hi %d", 20))总结:。
wa中lua的用法
wa中lua的用法Lua是一种轻量级、可嵌入的语言,在很多领域都有广泛的应用。
在WA(Weaver自动化)中,Lua也得到了广泛的应用。
本篇文章将介绍Lua在WA中的用法。
一、Lua的基本语法Lua是一种简洁而易于学习的语言,它的基本语法包括变量、数据类型、控制结构、函数等。
在WA中,Lua的使用方式和一般的Lua 代码没有太大的区别。
1. 变量Lua中的变量类型包括数字、字符串、布尔值、表等。
变量在使用前需要声明,可以使用`var = value`的形式来声明变量,例如`num = 10`、`str = "Hello"`等。
2. 数据类型Lua支持多种数据类型,包括数字、字符串、布尔值、表、元表等。
Lua中的表是一种可变的数据结构,可以用来存储任意类型的数据。
元表是一种可以用来操作表的表,在WA中经常用来进行条件判断和循环操作。
3. 控制结构Lua支持条件判断和循环操作,可以使用if语句、for循环等控制结构来实现复杂的逻辑。
在WA中,Lua的控制结构通常和脚本控制结合使用,来实现自动化脚本的编写和执行。
二、Lua在WA中的应用在WA中,Lua可以用来实现各种自动化任务,例如文件操作、网络请求、数据库操作等。
下面介绍一些常见的用法:1. 文件操作Lua可以用来读取、写入、删除文件,实现自动化脚本的执行和文件管理。
例如,可以使用Lua的`io.open()`函数打开文件,使用`io.read()`函数读取文件内容,使用`io.write()`函数写入文件内容。
2. 网络请求Lua可以使用HTTP模块来实现网络请求,例如GET请求和POST 请求。
在WA中,可以使用Lua的网络请求功能来实现自动化脚本的自动化测试和数据分析。
3. 数据库操作Lua可以使用数据库模块来实现对数据库的操作,例如插入数据、查询数据等。
在WA中,可以使用Lua的数据库操作功能来实现自动化脚本的数据采集和处理。
lua 文本用法
lua 文本用法Lua 是一种轻量级的脚本语言,常用于嵌入到应用程序中。
在 Lua 中,文本处理通常涉及字符串操作。
以下是一些常用的 Lua 文本用法:1、字符串连接:使用 .. 运算符可以将两个字符串连接起来。
lualocal str1 = "Hello"local str2 = "World"local result = str1 .. " " .. str2print(result) -- 输出 "Hello World"2、字符串长度:使用 # 运算符可以获取字符串的长度。
lualocal str = "Hello"local length = #strprint(length) -- 输出 53、字符串截取:使用 sub 函数可以从字符串中截取子串。
lualocal str = "Hello World"local subStr = str:sub(1, 5) -- 从第1个字符开始,截取长度为5的子串print(subStr) -- 输出 "Hello"4、字符串替换:使用 gsub 函数可以替换字符串中的所有匹配项。
lualocal str = "Hello World"local newStr = str:gsub("World", "Lua")print(newStr) -- 输出 "Hello Lua"5、字符串大小写转换:使用 lower 和 upper 函数可以将字符串转换为小写或大写。
lualocal str = "Hello World"local lowerStr = str:lower()local upperStr = str:upper()print(lowerStr) -- 输出 "hello world"print(upperStr) -- 输出 "HELLO WORLD"这些是 Lua 中一些常见的文本用法。
LUA语言学习教程
LUA语言学习教程Lua是一种轻量级、高效、可扩展的脚本语言,被广泛应用于游戏开发、嵌入式系统等领域。
本文将介绍Lua语言的基础知识和常用语法,帮助读者快速入门Lua编程。
一、Lua语言的特点1. 轻量级:Lua的核心库非常小巧,仅包含一些基本的功能,但同时也支持通过扩展库来丰富功能。
2. 高效性:Lua的虚拟机执行速度很快,内存占用也相对较低。
3. 可嵌入性:Lua可以被嵌入到C/C++程序中,通过调用接口实现程序的扩展和灵活性。
4. 简洁易学:Lua语法简洁,容易上手,提供了丰富的基本数据类型和控制结构。
二、Lua基本语法与数据类型1.注释:以"--"开头的内容为单行注释,以"--[[]]"包裹的内容为多行注释。
2. 变量:Lua中的变量是动态类型的,不需要事先声明类型,直接赋值即可。
例如:a=10b = "Hello, Lua"3.数据类型:- nil:表示空值或未定义的变量。
- boolean:表示布尔类型,取值为true或false。
- number:表示数字类型,可以表示整数和浮点数。
- string:表示字符串类型。
- table:表示表类型,是Lua中唯一的复合数据类型,可以通过键值对来存储数据。
- function:表示函数类型。
4.控制结构:-条件控制语句:if condition then--执行语句elseif condition then--执行语句else--执行语句end-循环控制语句:while condition do--执行语句endfor var=begin, end, step do--执行语句endrepeat--执行语句until condition5.函数:函数是Lua中的一等公民,可以被赋值给变量,作为参数传递和返回值等。
函数的定义和调用方式如下:function func_name(parameter_list)--函数体return return_valuesendlocal result = func_name(arg1, arg2)三、Lua扩展库的使用Lua提供了丰富的扩展库,以便开发者使用更多的功能。
lua菜鸟教程
lua菜鸟教程Lua 是一种轻量级的脚本语言,常用于嵌入到其他应用程序中,添加自定义的功能和扩展性。
下面是一些 Lua 的基本概念和语法:1. 数据类型:- nil:表示空值。
- boolean: 布尔类型,只有 true 和 false 两个取值。
- number: 表示实数,Lua 不区分整数和浮点数。
- string: 字符串类型,用双引号或单引号包裹起来。
- function: 函数类型,可以被赋值给变量和作为参数传递。
- userdata: 表示一种用户自定义的数据类型。
- thread: 表示独立执行的线程。
- table: 表示关联数组,是 Lua 中唯一的数据结构。
2. 基本语法:- 注释: 使用双连字符 "--" 开头,可以单行注释,也可以在行末添加注释。
- 变量: 用于存储不同类型的数据。
- 运算符: 包括算术运算符、关系运算符、逻辑运算符等。
- 条件语句: 包括 if 语句和 switch 语句。
- 循环语句: 包括 while 循环、repeat...until 循环和 for 循环。
- 函数: 使用 function 关键字定义函数,并通过函数名调用。
- 模块: 用于组织代码,提供代码的复用性和封装性。
- 文件操作: 包括读取文件内容、写入文件内容等操作。
3. 标准库:- io 库: 用于文件操作。
- string 库: 用于处理字符串。
- math 库: 提供数学函数。
- table 库: 用于操作 Lua 中的表。
- os 库: 提供与操作系统相关的功能。
通过学习这些基本知识,可以开始编写简单的 Lua 程序。
希望这些内容能够帮助你入门 Lua 编程!。
lua的基本知识
Programming in LUA中文版转自csdn的BLOG(译者应该是ouyangbuxiu)序(Preface):当前很多程序语言致力于帮你编写成千上万行的代码,所以这种类型的语言提供包、命名空间、复杂的类型系统、无数的结构、上千页的文档需要学习。
Lua并不帮你编写大量的代码的程序,相反,Lua帮你用少量的代码解决问题。
为实现这个目标,像其他语言一样Lua依赖于其可扩展性。
然而与其他语言不同的是,不仅用Lua编写的软件易于扩展,其他语言比如c/c++编写的软件也很容易扩展。
一开始,Lua就被设计成很容易和传统的c/c++整合的语言。
这种语言的二元性带来很大的好处。
Lua是一个小巧简单的语言,因为Lua不致力于做c语言已经做得很好的领域,比如:性能,底层操作以及与第三方软件的接口。
Lua依赖于c去做完成这些任务。
Lua所提供的机制是c不善于的:高级语言、动态结构、简洁、易于测试和调试。
正因为如此,Lua 具有很好的安全保证,自动内存管理,容易处理字符串以及其他大小动态改变的数据。
Lua不仅是一种易于扩展的语言,也是一种易整合语言(gluelanguage);Lua支持基于组件的软件开发方法,我们可以将一些已经存在的高级组件整合在一起实现一个应用。
一般情况下,组件使用像c/c++的静态的语言编写。
Lua是我们整合各个组件的粘合剂。
通常情况下,组件(或对象)表现为具体的在程序开发过程中很少变化的、占用大量CPU时间的决定性的程序,比如窗口部件和数据结构。
对那种在产品的生命周期内变化很多的应用使用Lua可以方便的适用变化。
除了作为整合语言外,Lua自身也是一个功能强大的语言。
Lua不仅可以整合组件,还可以编辑组件甚至完全使用Lua创建组件。
除了Lua外,还有很多类似的脚本语言,比如:Perl, Tcl, Ruby, Forth, Python;下面这些特征是Lua特有的:可扩展性:Lua的扩展性非常卓越,以至于很多人把Lua当作一个搭建领域语言的工具(注:比如游戏脚本)。
Lua在windows下的安装及环境配置
Lua在windows下的安装及环境配置lua for windows其实是⼀整套Lua的开发环境,它包括:Lua Interpreter(Lua解释器)Lua Reference Manual(Lua参考⼿册)Quick Lua Tour (Lua快速⼊门)Examples (Lua范例)Libraries with documentation (⼀些Lua库和⽂档)SciTE (⼀个很棒的多⽤途编辑器,已经对Lua做了特殊设置)其它详细的内容请到luaforge的主页上查看。
之所以推荐这套环境是因为它整合了在windows学习和开发Lua所需要的所有东西,对于新⼿来说是⾮常体贴的,附带的SciTE只要经过简单配置就能够很⽅便的编写Lua程序,编译,运⾏,调试。
它还是附带⾃动提⽰和代码⾃动补全功能的哦,对于⽤惯VC + VA的开发⼈员来说,实在是太亲切了。
下⾯介绍⼀下整个lfW:下载lfw,最新的版本是5.1.3.13,直接安装,注意最后⼀步会询问SciTE编辑器是否使⽤“⿊⾊”风格,我⽐较喜欢⿊⾊底⾊,所以在这⾥打钩,之后继续。
安装完成后,学习Lua所需要的⼀切环境就全部安装完毕,⼗分简单。
下⾯可以测试是否安装成功打开SciTE,新建⼀个⽂件,输⼊⼀⾏lua代码:复制代码代码如下:print("hello,lua")然后保存为hello.lua,注意保存⽂件时要加⽂件名后缀.lua,否则可能不能正确的运⾏。
按F5,如果SciTE的输出窗⼝出现>lua -e "io.stdout:setvbuf 'no'" "hello.lua"hello,lua>Exit code: 0字样则代表整个lua开发环境安装成功。
如果对SciTE默认的配⾊⽅案或者字体不满意,点击【Options】菜单中的【Open Global Options File】,则可以看到SciTE 环境的全局配置⽂件。
Lua5.3参考手册
Lua5.3参考手册作者 Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes译者云风, PUC-Rio 版权所有© 2015 ,在遵循 Lua license 条款下,可自由使用。
目录· 索引· 中英术语对照表1 –简介Lua 是一门扩展式程序设计语言,被设计成支持通用过程式编程,并有相关数据描述设施。
同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。
它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。
Lua 由clean C(标准 C 和 C++ 间共通的子集)实现成一个库。
作为一门扩展式语言,Lua 没有"main" 程序的概念:它只能嵌入一个宿主程序中工作,该宿主程序被称为被嵌入程序或者简称宿主。
宿主程序可以调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注册 C 函数让 Lua 代码调用。
依靠 C 函数,Lua 可以共享相同的语法框架来定制编程语言,从而适用不同的领域。
Lua 的官方发布版包含一个叫做 lua 的宿主程序示例,它是一个利用 Lua 库实现的完整独立的 Lua 解释器,可用于交互式应用或批处理。
Lua 是一个自由软件,其使用许可证决定了它的使用过程无需任何担保。
本手册所描述的实现可以在 Lua 的官方网站 找到。
与其它的许多参考手册一样,这份文档有些地方比较枯燥。
关于Lua 背后的设计思想,可以看看Lua 网站上提供的技术论文。
至于用Lua 编程的细节介绍,请参阅 Roberto 的书,Programming in Lua。
2 –基本概念本章描述了语言的基本概念。
2.1 –值与类型Lua 是一门动态类型语言。
这意味着变量没有类型;只有值才有类型。
语言中不设类型定义。
所有的值携带自己的类型。
Lua 中所有的值都是一等公民。
LuaSTG参考手册(全)(v0.33)
LuaSTG参考⼿册(全)(v0.33)⼀.综述LuaSTG是基于以作为扩展脚本的弹幕射击游戏引擎。
新建并运⾏第⼀个⼯程。
⾸先在mod⽂件夹下新建⼀个⽂件夹,⽂件夹名即为⼯程名。
⽐如在这⾥我们新建⼀个叫做hello的⽂件夹。
之后在hello⽂件夹下新建⼀个root.lua⽂件,内容如下:hello_stage=stage.New('hello',true)function hello_stage:init()Print('Hello, LuaSTG.')end之后打开根⽬录下的setting.lua,将mod设置为⼯程名’hello’,并且将debug设置为true。
此时运⾏lstg.exe,将会出现⼀个⿊窗⼝,同时命令⾏⾥将会出现以下内容:zip warning: ../hello.zip not found or emptyadding: root.lua (104 bytes security) (deflated 16%)Hello, LuaSTG.这样我们就新建并运⾏了⼀个最简单的LuaSTG⼯程。
⼆.关卡、类和单位1.关卡stage.New(stage_name,as_entrance,is_menu)声明并返回⼀个关卡。
stage_name是关卡的名称,为字符串类型,不能重复。
as_entrance参数表⽰是否将该关卡作为整个⼯程的⼊⼝关卡,默认为false。
is_menu参数表⽰该关卡是否为⼀个菜单关卡,默认为false。
(菜单关卡和游戏关卡的唯⼀区别在于按下ESC键时是否弹出暂停菜单。
)函数将返回这个关卡。
声明关卡之后,还需要为其定义回调函数,否则他将什么都不会做,这些回调函数在各⾃特定的时机会被系统调⽤。
定义的格式是:function your_stage:function_name()-- do somethingendyour_stage是由stage.New函数返回的关卡,function_name为init、del、frame、render之⼀,他们都有各⾃的作⽤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 - 语句式函数调用2.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 - 堆栈操作3.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 - 钩子5 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 致谢8 与以前版本的不兼容性8.1 语言上的变动8.2 库的变更8.3 API 上的改动9 Lua 完整语法参考1 - 绪论Lua是一种为支持有数据描述机制的一般过程式编程语言而设计的扩展编程语言。
它同样可以对面向对象语言、函数式程序设计(Functional Programming,如Lisp)以及数据驱动编程(data-driven programming)提供很好的支持。
它的目标是被用作一种强大的、轻型的配置语言。
Lua目前已经被实现为一个扩展库,是用clean C (ANSI C/C++的一个通用子集)编写的。
作为一个扩展语言,Lua没有"Main"函数的概念:它仅仅是嵌入一个宿主程序进行工作,可以称之为嵌入式编程或者简单的说是宿主编程。
这个宿主程序可以调用函数来执行Lua的代码片断,可以设置和读取Lua的变量,可以注册C函数让Lua代码调用。
Lua的能力可以扩展到更大范围,在不同的领域内,这样就在同样的语法框架下创建了你自定义的编程语言。
Lua的发行版包括一个独立的嵌入式程序,lua,他使用Lua的扩展库来提供一个完全的Lu a解释器。
Lua是自由软件,通常不提供任何担保,如它的版权说明中叙述的那样。
手册中描述的实现在Lua的官方网站可以找到,。
如果需要知道Lua设计背后的一些决定和讨论,可以参考以下论文,它们都可以在Lua的网站上找到。
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes. Lua---an extensible extension language. Software: Practice & Experience26 #6 (1996) 635-652.L. H. de Figueiredo, R. Ierusalimschy, and W. Celes. The design and implementation of a language for extending applications.Proceedings of XXI Brazilian Seminar on Software and Hardware (1994) 273-283.L. H. de Figueiredo, R. Ierusalimschy, and W. Celes. Lua: an extensible embedded language. Dr. Dobb's Journal 21 #12 (Dec 1996) 26-33.R. Ierusalimschy, L. H. de Figueiredo, and W. Celes. The evolution of an extension language: a history of Lua, Proceedings of V Brazilian Symposium on Programming Languages (2001) B-14-B-28.Lua在葡萄牙语中的意思是“月亮”,发音是 LOO-ah。
2 - 语言这一章将描述Lua的词法、语法和语义结构。
换句话说,这一章会讲什么标记是合法的,他们是如何组合的,以及他们的组合是什么含义。
语言结构会使用常用的扩展BNF范式来解释,如{a} 表示0或多个a,表示a是可选的(0个或1个)。
非终端字体(不能显示的)用斜体表示,关键字是粗体,其他终端符号用typ ewriter(等宽)字体,并用单引号引出。
2.1 - 词法约定Lua中的标识符(Identifiers)可以是任意的数字、字符和下划线“_”,但不能以数字开头。
这条规则符合大多数编程语言中的标识符的定义。
(字符的具体定义要根据系统的地区设置:任何区域设置可以认同的字母表中的字母都可以用在标识符中。
)下面的关键字(keywords)为保留关键字不可以作为标识符出现:and break do else elseifend false for function ifin local nil not orrepeat return then true until whileLua对大小写敏感:and是一个保留字,但是 And 和 AND 是两个不一样的、但都合法的标识符。
习惯上来说,以下划线开始且后面跟着大写字母的标识符 (例如 _VERSION) 是为Lua内部变量所保留的。
下面的字符(串)是其他的一些标记:+ - * / ^ =~= <= >= < > ==( ) { } [ ]; : , . .. ...字符串(Literal strings)以单引号或者双引号定界,同时可以包含以下C语言风格的转义字符:\a --- 铃声(bell)\b --- 回退(backspace)\f --- form feed\n --- 新行(newline)\r --- 回车(carriage return)\t --- 水平制表符(horizontal tab)\v --- 垂直制表符(vertical tab)\\ --- 反斜杠(backslash)\" --- 双引号(quotation mark)\' --- 单引号(apostrophe)\[ --- 左方括号(left square bracket)\] --- 右方括号(right square bracket)另外,一个 `\newline´(一个反斜杠加上一个真正的换行符)会导致字符串内的分行。
字符串中的字符也可以使用转义字符`\ddd´通过数字值来指定。
ddd 是最多为3个十进制数字的序列。
Lua中的字符串也可以包含8进制数字,包括嵌入零,它可以表示为 `\0´。
字符串也可以用双方括号来定界[[ ··· ]]。
这种括号方式的语法,字符串可以跨越多行,也可以包含嵌套的,同时不会转义任何序列。
方便起见,当开始的 `[[´后面紧跟着一个换行符的话,这个换行符不会包括在字符串内。
举个例子:在一个使用ASCII编码(其中`a´的编码是 97,换行符是 10,字符`1´是 49)的系统中,以下四种格式得到的都是同一个字符串:1."alo\n123\""2.'\97lo\10\04923"'3.[[alo4.123"]]4.[[5.alo6.123"]]数值常量(Numerical constants)可以有一个可选的底数部分和一个可选的指数部分。
以下是有效的数值常量:3 3.0 3.1416 314.16e-2 0.31416E1注释(Comments)可以在任何地方出现,必须在最前面加上双减号 (--)。