arg
argstest.lua
print(arg) print(type(arg)) if arg ~= nil then print("------") print(arg[-1]) print(arg[0]) print("------") for i, v in ipairs(arg) do print(i .. "->" .. v) print(tostring(i) .. "->" .. tostring(v)) end end
>lua argstest.lua a b c 1 2 3 table: 003CA608 table ------ lua argstest.lua ------ 1->a 1->a 2->b 2->b 3->c 3->c 4->1 4->1 5->2 5->2 6->3 6->3
字符串
字符串长度
> s = "abcdefg" > print(#s) 7
还可以通过string.len (s)来得到字符串的长度
> print(string.len(s)) 7
table
> t = {["a"] = "a1", ["b"] = "b1", ["c"] = "c1", ["d"] = "d1"}
> print(t)
table: 003CC548
> print(type(t))
table
table长度
> t = {} > print(#t) 0 > t = {"a", "b", "c", "d", "e"} > print(#t) 5 > t = {"a", "b", "c", "d", "e", nil, nil, nil} > print(#t) 5 > t = {"a", "b", "c", "d", "e", nil, nil, nil, "f", "g"} > print(#t) 10
还可以
> t = {} > print(table.getn(t)) 0 > t = {"a", "b", "c", "d", "e"} > print(table.getn(t)) 5 > t = {"a", "b", "c", "d", "e", nil, nil, nil} > print(table.getn(t)) 5 > t = {"a", "b", "c", "d", "e", nil, nil, nil, "f", "g"} > print(table.getn(t)) 10
> table.setn(t, 8) stdin:1: 'setn' is obsolete
> t = {1, 2, nil, 3, 4} > print(ipairs(t)) function: 003C62A8 table: 003CC528 0
> t = {1, 2, nil, 3, 4} > print(pairs(t)) function: 003C6318 table: 003CC528 nil
> t = {} > print(next(t)) nil > t = {1, 2, 3} > print(next(t)) 1 1 > t = {nil, 1, 2, 3} > print(next(t)) 2 1
function
function在lua中也是一种类型。可以将一个函数赋值给变量。
> fx = function (arg) print(arg) end
然后进行调用:
> fx("greeting") greeting
> function fx(arg) >> print("args:" .. arg) >> end > fx("greeting") args:greeting > fx1 = fx > fx1("greeting") args:greeting
> function fx(arg) >> print(arg) >> end
> fx("greeting") greeting
> fx "greeting" greeting
匿名函数
> pcall(function(arg) >> print(arg) >> end, "greeting") greeting
> print(t.a)
a1
> print(t["a"])
a1
> a = "abcdefg"
> print(a)
abcdefg
> print(type(a))
string
> a = 12
> print(a)
12
> print(type(a))
number
> a = nil
> print(a)
nil
> print(type(a))
nil
> a = true
> print(a)
true
> print(type(a))
boolean
> a = {}
> print(a)
table: 003CD2B8
> print(type(a))
table
> t = {["a"] = "a1", ["b"] = "b1", ["c"] = "c1", ["d"] = "d1"}
> print(t)
table: 003CC548
> print(type(t))
table
> iarray = require("iarray")
> print(iarray)
table: 003CD908
> print(type(iarray))
table
> a = iarray.new(10)
44bytes allocated.
> print(a)
userdata: 003CC9D0
> print(type(a))
userdata
> a = function() end
> print(a)
function: 003CDF08
> print(type(a))
function
> co = coroutine.create(a)
> print(co)
thread: 003C6B28
> print(type(co))
thread
function
上面提到lua中的函数也是一种类型,可以赋值绑定给一个变量。
函数定义:
stat ::= function funcname funcbody funcname ::= Name {‘.’ Name} [‘:’ Name] funcbody ::= ‘(’ [parlist] ‘)’ block end
lua还可以定义匿名函数
函数定义:
functiondef ::= function funcbody funcbody ::= ‘(’ [parlist] ‘)’ block end
lua函数还可以是local函数
函数定义:
stat ::= local function Name funcbody funcbody ::= ‘(’ [parlist] ‘)’ block end
定义一个table:
> t = {} > print(t) table: 003CF2C8 > print(type(t)) table
> function t:fx1() >> print("greeting") >> end > t:fx1() greeting
> function t.fx2() >> print("greeting") >> end > t.fx2() greeting
不定长变量
> function fx(...) >> for i, v in ipairs(arg) do >> print(i .. "->" .. v) >> end >> end > fx() > fx("a") 1->a > fx("a", "b", "c", "e", "f", "g") 1->a 2->b 3->c 4->e 5->f 6->g
dump例子
dump.lua
-- local fd = io.input("./cmodule/alloc/iarray.lib") -- local fd = io.input("./cmodule/alloc/alloc.cpp") local fd = io.input("./cmodule/alloc/Makefile") local content = fd:read("*a") local len = string.len(content) local fragment = "" local origin = ""; for i = 1, len do local b = string.byte(content, i) local btn = tonumber(b) local hex = string.format("%02X", btn) fragment = fragment..hex -- local c = string.sub(content, i, i) local c = string.char(b) if c == "\r" or c == "\n" then c = "_" end origin = origin..c if string.len(fragment) == 32 then print(fragment, origin) fragment = "" origin = "" end end while string.len(fragment) < 32 do fragment = fragment.." " end print(fragment, origin) fragment = "" origin = ""
>lua dump.lua 56435F504154483D443A5C7573725C62 VC_PATH=D:\usr\b 696E5C4D6963726F736F667420566973 in\Microsoft Vis 75616C2053747564696F5C564339380A ual Studio\VC98_ 434C3D22242856435F50415448295C42 CL="$(VC_PATH)\B 696E5C636C2E657865220A4C494E4B3D in\cl.exe"_LINK= 22242856435F50415448295C42696E5C "$(VC_PATH)\Bin\ 6C696E6B2E657865220A0A0A494E434C link.exe"___INCL 5544453D22242856435F50415448295C UDE="$(VC_PATH)\ 496E636C756465220A4C49423D222428 Include"_LIB="$( 56435F50415448295C4C6962220A0A4C VC_PATH)\Lib"__L 55415F504154483D443A5C7573725C62 UA_PATH=D:\usr\b 696E5C4C75615C352E310A494E434C55 in\Lua\5.1_INCLU 44455F4C55413D2224284C55415F5041 DE_LUA="$(LUA_PA 5448295C696E636C756465220A4C4942 TH)\include"_LIB 5F4C55413D2224284C55415F50415448 _LUA="$(LUA_PATH 295C6C6962220A0A230A44454255473D )\lib"__#_DEBUG= 2E0A0A4255494C443A0A092428434C29 .__BUILD:_ $(CL) 202F4758202F5733202F49202428494E /GX /W3 /I $(IN 434C55444529202F492428494E434C55 CLUDE) /I$(INCLU 44455F4C554129202F63202F466F2428 DE_LUA) /c /Fo$( 4445425547292F202A2E6370700A0924 DEBUG)/ *.cpp_ $ 284C494E4B29202F444C4C202F4C4942 (LINK) /DLL /LIB 504154483A24284C494229202F4C4942 PATH:$(LIB) /LIB 504154483A24284C49425F4C55412920 PATH:$(LIB_LUA) 2F4F55543A24284445425547292F6961 /OUT:$(DEBUG)/ia 727261792E646C6C2024284445425547 rray.dll $(DEBUG 292F2A2E6F626A0A09 )/*.obj_
Lua Socket开发
kad.lua
local socket = require("socket") local tcp, err = socket.tcp() if tcp == nil then print(err) error() end tcp:setoption("reuseaddr",true) local result, err = tcp:bind("localhost", 3131) print(result) print(err) if result == nil then print(err) error() end result,err = tcp:listen(50) if result == nil then print(err) error() end print "listening" local stop = false while not stop do tcp:settimeout(0.01) local client, err = tcp:accept() if client ~= nill then local co local fn = function(sock) print(co) while not stop do local rb, err = sock:receive() print "" if rb ~= nil then if rb == "STOP" then stop = true else print("read "..rb) sock:send(rb) end end end -- coroutine.resume(co, sock) end co = coroutine.create(fn) coroutine.resume(co, client) end end
运行服务端程序:
>lua kad.lua 1 nil listening
运行Telnet连接到服务器:
>telnet localhost 3131
>lua kad.lua 1 nil listening thread: 003C6B68 read abcdefg read abcdefg read abcdefg read 1111111
servertest1.lua
local socket = require("socket") local tcp, err = socket.tcp() if tcp == nil then print(err) error() end tcp:setoption("reuseaddr",true) local result, err = tcp:bind("localhost", 3131) print(result) print(err) if result == nil then print(err) error() end result,err = tcp:listen(50) if result == nil then print(err) error() end local ip, port = tcp:getsockname() print("listening " .. ip .. ":" .. port) local stop = false local ctb = {} while not stop do tcp:settimeout(0.01) local client, err = tcp:accept() if client ~= nill then local ip, port = client:getpeername() print("new conn from " .. ip .. ":" .. port) ctb[client] = {socket = client} local ip, port = ctb[client].socket:getpeername() end for sock, ctx in pairs(ctb) do local recvt, sendt, status = socket.select({sock}, nil, 1) if #recvt > 0 then local rb, err = sock:receive() if rb ~= nil then if rb == "STOP" then stop = true else print("read "..rb) sock:send(rb) end end end end end
>lua servertest1.lua 1 nil listening 127.0.0.1:3131 new conn from 127.0.0.1:4141 read 111111 read 222222 new conn from 127.0.0.1:4144 read aaaaaa read ddddd new conn from 127.0.0.1:4145 read abcdefg read hijklmn
Lua C模块开发
Lua C模块开发
iarray例子
例子工程文件列表:
>tree . /F
卷 D 的文件夹 PATH 列表
卷序列号为 F075-351A
D:\***\ALLOC
alloc.cpp
alloc.obj
iarray.dll
iarray.exp
iarray.lib
liballoc.cpp
liballoc.obj
Makefile
没有子文件夹
alloc.cpp
#pragma comment(lib, "lua5.1.lib") extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> }; typedef struct { int size; int *data; } array_it; _declspec(dllexport) int i_array_new(lua_State *L) { int n = luaL_checkint(L, 1); size_t nbytes = sizeof(array_it) + (n - 1) * sizeof(int); array_it *i = (array_it *) lua_newuserdata(L, nbytes); i->size = n; printf("%dbytes allocated.\n", nbytes); return 1; } static const luaL_Reg iarray[]= { {"new",i_array_new}, {NULL, NULL} }; extern "C" _declspec(dllexport) int luaopen_iarray(lua_State *L) { luaL_openlib(L, "iarray", iarray, 0); return 1; }
liballoc.cpp
#include <windows.h> BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }
DllMain函数是可选的,所以liballoc.cpp也可以不需要。
Makefile
VC_PATH=D:\*** CL="$(VC_PATH)\Bin\cl.exe" LINK="$(VC_PATH)\Bin\link.exe" INCLUDE="$(VC_PATH)\Include" LIB="$(VC_PATH)\Lib" LUA_PATH=D:\***\5.1 INCLUDE_LUA="$(LUA_PATH)\include" LIB_LUA="$(LUA_PATH)\lib" # DEBUG=. BUILD: $(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /c /Fo$(DEBUG)/ *.cpp $(LINK) /DLL /LIBPATH:$(LIB) /LIBPATH:$(LIB_LUA) /OUT:$(DEBUG)/iarray.dll $(DEBUG)/*.obj
编译链接生产动态链接库:
>nmake ... alloc.cpp liballoc.cpp Generating Code... ... Creating library ./iarray.lib and object ./iarray.exp
将动态链接库iarray.dll拷贝到<LUA_HOME>\clibs目录下:
>cp -rf iarray.dll D:\***\clibs
>lua
> iarray = require("iarray") > print(iarray) table: 003CD908 > a = iarray.new(10) 44bytes allocated. > print(a) userdata: 003CDD90
Lua的一些资料:https://lobin.iteye.com/blog/2339953
dnsmasq_signals.lua
相关推荐
Lua源代码是文本形式的,易于阅读和编写,但为了保护代码不被轻易篡改或盗用,开发者通常会将Lua代码编译成字节码(.lua.c文件或.luac文件)。"LUAC"就是Lua的官方编译器,它将Lua源代码转换为字节码,以提高执行...
LUAC脚本是一种基于Lua语言的编译格式,它将Lua源代码编译成字节码,以便在 Lua 解释器上高效运行。LUAC(Lua Compiler)是Lua官方提供的编译器,它将源代码转换为这种优化的字节码,以提高执行速度。在游戏开发、...
《Lua在STM32F407上的移植与应用》 在嵌入式系统领域,为了提高代码的可读性、可维护性和灵活性,越来越多的开发者选择使用高级脚本语言,如Lua,来替代传统的C/C++编程。本文将详细探讨如何在STM32F407微控制器上...
"LUAC解密工具"就是针对Lua编译后的二进制文件(.luac)进行解密的工具,目的是为了让加密过的Lua代码能够恢复成可读的源代码格式(.lua)。 LUAC是Lua的编译器,它将Lua源代码转换为字节码,这个过程通常是为了...
所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...
Lua是一种轻量级的脚本语言,主要用于嵌入到其他应用程序中以增加其功能和定制性。它的设计目标是简洁、高效和可扩展。在本文中,我们将详细探讨Lua 5.4.6这一最新版本的源代码及其相关知识点。 首先,让我们了解...
Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。LuaEditor是一款专为Lua编程设计的中文编辑器,它为程序员提供了方便的开发环境,提高了编写和调试Lua代码的效率。luaEditor-v4.10是该...
lua解密工具.apk是一款用于解密Lua脚本的工具,适用于Android操作系统。Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和网络编程等领域。通过使用该工具,开发者可以对Lua脚本进行反编译、编辑和重新编译...
使用`lua_pushnumber`、`lua_pushstring`等函数将C++数据推送到Lua栈,使用`lua_tonumber`、`lua_tostring`等函数从Lua栈获取数据。 6. 清理:调用`lua_settop(L, 0)`清空栈,防止内存泄漏。 二、Lua调用C++函数 ...
LuaBitOp-1.0.2 是一个针对 Lua 语言的位操作库,它提供了对二进制数据进行位运算的功能。位操作是计算机科学中的基础概念,它们在底层编程、数据处理和优化中有着广泛的应用。LuaBitOp 的源码可以帮助开发者深入...
Unity是世界上最受欢迎的游戏开发引擎之一,它支持多种编程语言,其中就包括通过XLua插件使用的Lua。XLua是一个高效、强大的Lua脚本绑定工具,它使得开发者可以在Unity项目中利用Lua语言的强大功能,同时保持与C#...
在Windows环境下安装Lua编程语言,主要是为了进行软件开发或脚本编写。Lua是一种轻量级、解释型的脚本语言,以其简洁的语法和高效性能而受到开发者喜爱。以下是关于在Windows上安装Lua 5.1.5版的详细步骤以及相关...
Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。它的源代码可读性高,易于学习和使用。在本文中,我们将深入探讨Lua的编译与反编译过程,以及相关的工具和技术。 首先,我们要理解Lua...
### Lua 5.2 参考手册核心知识点详解 #### 一、引言与概述 **Lua** 是一种扩展编程语言,旨在支持通用的过程式编程,并具备数据描述能力。此外,Lua 还提供了面向对象编程、函数式编程以及数据驱动编程的良好支持...
《Unity开发Lua:EmmyLua环境安装详解》 在Unity引擎中使用Lua脚本语言,可以提高游戏开发的效率和灵活性。EmmyLua是专为Unity设计的一个强大的Lua集成开发环境,它提供了一整套方便的工具链,使得在Unity中编写、...
lua5.3(32位/64位)windows 预编译(exe/DLL) adding: lua5.3.5-x86/lua.exe (in=14336) (out=7311) (deflated 49%) adding: lua5.3.5-x86/lua.o (in=24873) (out=9654) (deflated 61%) adding: lua5.3.5-x86/lua...
《Lua实例代码大全》是针对Lua编程语言的一份详尽实例集合,涵盖了多个核心库和扩展库的使用,包括luacurl(网络连接)、luafilesystem(文件系统操作)、luajson(JSON处理)、luasocket(网络套接字)、luasql...
Lua是一种简单高效的脚本编程语言,由Roberto Ierusalimschy等编写,并由***翻译并发布。该语言简单易学,与C、Java等编程语言兼容性好,特别适用于需要脚本编程的场合,比如大型游戏中的剧情控制、手机应用开发等。...
在windows下 用lua转换将gbk转为utf 8 2013 11 16 17:56 0人阅读 评论 0 收藏 编辑 删除 本来以为很简单 结果找了半天发现都是很坑爹的办法 linux下可以直接安装luaiconv windows下呢 只好自己编了 本来想找个别人写...
a utf-8 support module for Lua and LuaJIT 源码地址:https://github.com/starwing/luautf8 编译后可用的库: Linux版:lua-utf8.so Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本...