1, mac安装lua
wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
tar -zxvf lua-5.1.5.tar.gz && cd lua-5.1.5
make macosx test
sudo make install
bin -> /usr/local/bin --> 将lua.c 编译成可执行文件 lua
inc -> /usr/local/include
lib -> /usr/local/lib --> 只有 一个 liblua.a
lua和erlang一样,有 嵌入 和 交互 两种模式, 交互模式有赖于lua.c程序
浅析lua.c 文件:
lua_State *L = lua_open(); /* create state lua_open() 只是宏 ,替换 lua_newstate() */
int status = lua_cpcall(L, &pmain, &s);
int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
// Calls the C function func in protected mode. func starts with only one element in its stack
static int pmain (lua_State *L) {
}
typedef int (*lua_CFunction) (lua_State *L);
union GCObject {
GCheader gch; // 等同 Commonheader
union TString ts;
union Udata u;
union Closure cl;
struct Table h;
struct Proto p;
struct lua_State th;
};
typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; //
typedef struct lua_TValue { Value value; in tt } TValue; // Tagged Value
typedef TValue *StkId; /* 指针 index to stack elements */
/* tt 取值区间 */
#define LUA_TNONE (-1)
#define LUA_TNIL 0
#define LUA_TBOOLEAN 1
#define LUA_TLIGHTUSERDATA 2
#define LUA_TNUMBER 3
#define LUA_TSTRING 4
#define LUA_TTABLE 5
#define LUA_TFUNCTION 6
#define LUA_TUSERDATA 7
#define LUA_TTHREAD 8
typedef union Closure { CClosure c; LClousure l; } Closure;
struct lua_State {
StkId top; /* first free slot in the stack */
StkId stack; /* stack base 计算: ptrdiff_t old_top = L->top - L->stack */
StkId stack_last; /* last free slot in the stack */
CallInfo *ci; /* call info for current function */
CallInfo *base_ci; /* array of CallInfo's 计算: ptrdiff_t old_ci = L->ci - L->base */
CallInfo *end_ci; /* points after end of ci array 等同 L->base_ci + L->size_ci - 1 */
int size_ci; /* size of array `base_ci' */
StkId base; /* base of current function 等同于 L->ci->base; */
TValue l_gt; /* table of globals */
}
Lua解释器运行脚本
% lua hello.lua
hello.lua:
print("enter a number:")
a = io.read("*number");
print(a)
交互模式 加载程序块
> dofile("mydef.lua")
> n = calc(3.4, 1)
> print(n)
在未初始化的变量不会报错, 返回nil
删除某个变量,只需设为nil
注释: -- chunk
-- [[
-- ]]
lua -e "print(math.sin(12))" // 命令行执行 lua代码
lua有8种基础类型: nil boolean number string user data function thread table
类型查看函数:type(xx)
assert (v [, message]) 相当于C的断言,
if nil ~= cond then
--
elseif 2== cond then
--
else
--
end
string.len(s) 返回字符串s的长度;
string.rep(s, n) 返回重复n次字符串s的串;
string.lower(s) 将s中的大写字母转换成小写
string.upper(s) 将s中的小写字母转换成大写
string.sub(s,i,j) 函数截取字符串s的从第i个字符到第j个字符之间的串。
Lua字符串的第一个字符索引从1开始。 -1指向最后一个字符
string.char函数和string.byte函数用来将字符在字符和数字之间转换。
string.char获取0个或多个整数,将每一个数字转换成字符,然后返回一个所有这些字符连接起来的字符串。
string.byte(s, i)将字符串s的第i个字符的转换成整数;
print(string.char(97)) --> a
print(string.char(99, 100, 101)) --> cde
print(string.byte("abc", -1)) --> 99
string.format()
格式字符串可能包含以下的转义码:
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
可以在%号后添加参数
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n,
若后接f则设定该浮点数的小数只保留n位, 若后接s则设定该字符串只显示前n位.
string.format("%x", 13) 输出d
string.format("%X", 13) 输出D
string.format("%e", 1000) 输出1.000000e+03
string.format("%u", 3.14) 输出3
string.format("%05d", 17) 输出00017
string.format("%5.3s", "monkey") 输出 mon
string.format("pi = %.4f", PI) 输出 pi = 3.1416
对 email 进行编码。将字母数字 @ . _ 之外的字符编码为 %XX 的形式。
local function _encode(str)
return string.format("%%%02X",string.byte(str))
end
function emailEncode(str)
return string.gsub(str,"([^%w_@.])",_encode)
end
解码:
local function _decode(str)
return string.char(tonumber(str,16))
end
function emailDecode(str)
return string.gsub(str,"%%(%w%w)",_decode)
end
如果你想不关心大小写对一个数组进行排序的话,你可以这样:
table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)
string.gsub (s, pattern, repl [, n])
s, _ = string.gsub("day day down", "down", "up")
print(s) --> day day up -- 第二个返回值表示 替换的次数
% 专义符
特殊字符:(). % + - * ? [ ^ $
模式串
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表 0的字符
+ 匹配前一字符 1 次或多次,最长匹配
* 匹配前一字符 0 次或多次,最长匹配
- 匹配前一字符 0 次或多次,最短匹配
? 匹配前一字符 0 次或 1次
以 '^' 开头表示只匹配目标串的开始部分,// [^%w_@.] 表示取反
以 '$' 结尾表示只匹配目标串的结尾部分。
%n, with n between 1 and 9, stands for the value of the n-th captured substring
repl是字符串,则为替换。
repl为函数,则每次匹配成功则调用该函数
repl是表
If the value returned by the table query or by the function call is a string or a number, then it is used as the replacement string; otherwise, if it is false or nil,
then there is no replacement
如去除字符串首尾的空格:
function trim (s)
return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end
参数为函数类型
x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
return loadstring(s)()
end)
--> x="4+5 = 9"
参数为表类型
local t = {name="lua", version="5.1"}
x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
--> x="lua-5.1.tar.gz"
string.gmatch(s, pattern)
Returns an iterator function that, each time it is called,
returns the next captures from pattern over string s.
If pattern specifies no captures, then the whole match
is produced in each call.
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w)
end
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k] = v
end
wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
tar -zxvf lua-5.1.5.tar.gz && cd lua-5.1.5
make macosx test
sudo make install
bin -> /usr/local/bin --> 将lua.c 编译成可执行文件 lua
inc -> /usr/local/include
lib -> /usr/local/lib --> 只有 一个 liblua.a
lua和erlang一样,有 嵌入 和 交互 两种模式, 交互模式有赖于lua.c程序
浅析lua.c 文件:
lua_State *L = lua_open(); /* create state lua_open() 只是宏 ,替换 lua_newstate() */
int status = lua_cpcall(L, &pmain, &s);
int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
// Calls the C function func in protected mode. func starts with only one element in its stack
static int pmain (lua_State *L) {
}
typedef int (*lua_CFunction) (lua_State *L);
union GCObject {
GCheader gch; // 等同 Commonheader
union TString ts;
union Udata u;
union Closure cl;
struct Table h;
struct Proto p;
struct lua_State th;
};
typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; //
typedef struct lua_TValue { Value value; in tt } TValue; // Tagged Value
typedef TValue *StkId; /* 指针 index to stack elements */
/* tt 取值区间 */
#define LUA_TNONE (-1)
#define LUA_TNIL 0
#define LUA_TBOOLEAN 1
#define LUA_TLIGHTUSERDATA 2
#define LUA_TNUMBER 3
#define LUA_TSTRING 4
#define LUA_TTABLE 5
#define LUA_TFUNCTION 6
#define LUA_TUSERDATA 7
#define LUA_TTHREAD 8
typedef union Closure { CClosure c; LClousure l; } Closure;
struct lua_State {
StkId top; /* first free slot in the stack */
StkId stack; /* stack base 计算: ptrdiff_t old_top = L->top - L->stack */
StkId stack_last; /* last free slot in the stack */
CallInfo *ci; /* call info for current function */
CallInfo *base_ci; /* array of CallInfo's 计算: ptrdiff_t old_ci = L->ci - L->base */
CallInfo *end_ci; /* points after end of ci array 等同 L->base_ci + L->size_ci - 1 */
int size_ci; /* size of array `base_ci' */
StkId base; /* base of current function 等同于 L->ci->base; */
TValue l_gt; /* table of globals */
}
Lua解释器运行脚本
% lua hello.lua
hello.lua:
print("enter a number:")
a = io.read("*number");
print(a)
交互模式 加载程序块
> dofile("mydef.lua")
> n = calc(3.4, 1)
> print(n)
在未初始化的变量不会报错, 返回nil
删除某个变量,只需设为nil
注释: -- chunk
-- [[
-- ]]
lua -e "print(math.sin(12))" // 命令行执行 lua代码
lua有8种基础类型: nil boolean number string user data function thread table
类型查看函数:type(xx)
assert (v [, message]) 相当于C的断言,
if nil ~= cond then
--
elseif 2== cond then
--
else
--
end
string.len(s) 返回字符串s的长度;
string.rep(s, n) 返回重复n次字符串s的串;
string.lower(s) 将s中的大写字母转换成小写
string.upper(s) 将s中的小写字母转换成大写
string.sub(s,i,j) 函数截取字符串s的从第i个字符到第j个字符之间的串。
Lua字符串的第一个字符索引从1开始。 -1指向最后一个字符
string.char函数和string.byte函数用来将字符在字符和数字之间转换。
string.char获取0个或多个整数,将每一个数字转换成字符,然后返回一个所有这些字符连接起来的字符串。
string.byte(s, i)将字符串s的第i个字符的转换成整数;
print(string.char(97)) --> a
print(string.char(99, 100, 101)) --> cde
print(string.byte("abc", -1)) --> 99
string.format()
格式字符串可能包含以下的转义码:
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
可以在%号后添加参数
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n,
若后接f则设定该浮点数的小数只保留n位, 若后接s则设定该字符串只显示前n位.
string.format("%x", 13) 输出d
string.format("%X", 13) 输出D
string.format("%e", 1000) 输出1.000000e+03
string.format("%u", 3.14) 输出3
string.format("%05d", 17) 输出00017
string.format("%5.3s", "monkey") 输出 mon
string.format("pi = %.4f", PI) 输出 pi = 3.1416
对 email 进行编码。将字母数字 @ . _ 之外的字符编码为 %XX 的形式。
local function _encode(str)
return string.format("%%%02X",string.byte(str))
end
function emailEncode(str)
return string.gsub(str,"([^%w_@.])",_encode)
end
解码:
local function _decode(str)
return string.char(tonumber(str,16))
end
function emailDecode(str)
return string.gsub(str,"%%(%w%w)",_decode)
end
如果你想不关心大小写对一个数组进行排序的话,你可以这样:
table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)
string.gsub (s, pattern, repl [, n])
s, _ = string.gsub("day day down", "down", "up")
print(s) --> day day up -- 第二个返回值表示 替换的次数
% 专义符
特殊字符:(). % + - * ? [ ^ $
模式串
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表 0的字符
+ 匹配前一字符 1 次或多次,最长匹配
* 匹配前一字符 0 次或多次,最长匹配
- 匹配前一字符 0 次或多次,最短匹配
? 匹配前一字符 0 次或 1次
以 '^' 开头表示只匹配目标串的开始部分,// [^%w_@.] 表示取反
以 '$' 结尾表示只匹配目标串的结尾部分。
%n, with n between 1 and 9, stands for the value of the n-th captured substring
repl是字符串,则为替换。
repl为函数,则每次匹配成功则调用该函数
repl是表
If the value returned by the table query or by the function call is a string or a number, then it is used as the replacement string; otherwise, if it is false or nil,
then there is no replacement
如去除字符串首尾的空格:
function trim (s)
return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end
参数为函数类型
x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
return loadstring(s)()
end)
--> x="4+5 = 9"
参数为表类型
local t = {name="lua", version="5.1"}
x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
--> x="lua-5.1.tar.gz"
string.gmatch(s, pattern)
Returns an iterator function that, each time it is called,
returns the next captures from pattern over string s.
If pattern specifies no captures, then the whole match
is produced in each call.
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w)
end
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k] = v
end