一.什么是lua语言?以及如何安装lua?
- Lua 是用 C 语言开发的可扩展的轻量级编程语言。它起源于 1993 年由 Roberto lerusalimschy,Luiz Henriqu
e de Figueiredo 与 Waddemar Celes 领导的一个内部项目。 - lua语言提供了更高的抽象,动态结构,垃圾回收,无冗余,易于测试和调试。
安装
-
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install -
如果缺少readline ,centos系统可以通过执行yum install readline-devel 进行安装
二.我们来编写第一个Lua程序吧
- lua提供交互式编程,在命令行执行lua就启动了交互模式
- 我们可以执行lua 之后 , 执行
print("Hello world")
我们还通过编写一个以.lua
结尾的文件
- 在test.lua中写入
print("Hello world")
- 执行
lua test.lua
- 输出
Hello world
三.Lua变量定义
-
一个变量定义就是告诉解释器在什么地方创建多大的存储空间,包括一个可选的类型以及该类型的一个或多个变量名的列表
-
type variable_list
-
local d,f = 5 , 7 – 声明局部变量
-
d,f = 7, 3 — 声明全局变量
-
d,f = 10 – 声明全局变量,d为10,f为nil
-
同时,还可以 local a,b
-
a = 10 , b = 30
-
交换变量 a,b = b,a
-
左值和右值 ,
一般能在内存中取到确切地址的是左值
,不然为右值
四.lua数据类型
nil
用于区分值是否有数据,nil 表示没有数据。boolean
布尔值,有真假两个值,一般用于条件检查。number
数值,表示实数(双精度浮点数)。string
字符串。function
函数,表示由 C 或者 Lua 写的方法。userdata
表示任意 C 数据。thread
线程,表示独立执行的线程,它被用来实现协程。table
表,表示一般的数组,符号表,集合,记录,图,树等等,它还可以实现关联数组。它可以存储除了
nil 外的任何值。
五.操作符号
-
==
判断两个操作数是否相等,若相等则条件为真,否则为假。 (A == B) 为假。 -
~=
判断两个操作数是否相等,若不相等则条件为真,否则为假。 (A ~= B) 为真。 -
>
如果左操作数大于右操作数则条件为真,否则条件为假。 (A > B) 为假。 -
<
如果左操作数小于右操作数则条件为真,否则条件为假。 (A < B) 为真。 -
>=
如果左操作数大于或等于右操作数则条件为真,否则条件为假。 (A >= B) 为假。 -
<=
如果左操作数小于或等于右操作数则条件为真,否则条件为假。 (A <= B) 为真。 -
and
逻辑与运算符。如果两个操作数都非零,则条件为真。 (A and B) 为
假。 -
or
逻辑或运算符。如果两个操作数中其中有一个非零,则条件为真。 (A or B) 为真。 -
not
逻辑非运算符。翻转操作数的逻辑状态。如果条件是真,则逻辑非运算符会将其变假。!(A and B) 为
真。 -
… 连接两个字符串。 若 a 为 “Hello”,b 为 “World”,则 a…b 返回 “Hello Worl
d”。 -
#
一元运算符,返回字符串或者表的长
度。#“Hello” 返回 5。
六.Lua语言和C/C++交互
lua和C交互的一个重要的数据结构lua_State,它是进行数据交换的堆栈,按照严格的LIFO规则(后进先出,始终存取栈顶)
void (lua_pushnil) ( lua_State *L );
void (lua_pushnumber) ( lua_State *L , lua_Number n);
void (lua_pushinteger) ( lua_State *L , lua_Integer n);
void (lua_pushlstring) ( lua_State *L , const char *s , size_t l);
void (lua_pushstring) ( lua_State *L , const char *s );
从函数名称我们可以看出我们可以向栈中压入nil, number, integer, string等类型.
lua还提供了函数,对堆栈进行插入,删除等操作例如:
int (lua_gettop) ( lua_State *L );
void (lua_settop) ( lua_State *L , int idx);
void (lua_pushvalue) ( lua_State *L , int idx);
void (lua_remove) ( lua_State *L , int idx);
void (lua_insert) ( lua_State *L , int idx);
void (lua_replace) ( lua_State *L , int idx);
int (lua_checkstack) ( lua_State *L , int sz);
函数中的idx参数是数据在栈中的索引,栈中的我们以第一个压入栈中的索引为1,第二个为2,也可以使用负数索引,-1始终表示栈顶的索引,-2表示栈顶下面的第二个元素索引.
lua_gettop函数获取堆栈中元素的个数,也是栈顶元素索引,一个负数索引-x对应于正数索引为gettop-x+1;
lua_settop设置栈顶到指定索引,例如:lua_settop(L, 0)也就是清空堆栈;
lua_remove和lua_insert表示先指定索引插入和删除元素,其他元素作相应移动;
lua_replace从栈顶弹出元素设置到指定的索引位置;
目前这部分先写到这里,有时间的话会进行添加