注意:千万不要再在Lua里面持有dependency()的第二个参数所指的的Lua对象的引用阅读全文>
发表于 @ 2009年01月08日 21:46:00|评论(loading...)|收藏
如果不做修改,直接以C++方式编译原来以C语言方式编译的Lua库。导出函数会被修饰成C++风格的函数名,
比如:
?luaopen_luanetobject@@YAHPAUlua_State@@@Z
原来是 luaopen_luanetobject。
下面这个函数可以直接解决这个问题。
function cpprequire(dllname) --dllname without '.dll'
local dll=dllname..'.dll'
假如,想写一个循环,依次处理2,3,5,7,11....质数位置的table元素。处理函数是:function kaka(index,ele) print(index,ele)--当然,这里什么也没干end按照文字顺序,我们先写一个循环:for index,ele in generate(table_x) do kaka(table_x[index])end那个generate()函数的任务就是生产一个元组序列:(2,ele2),(3,ele3),(5,ele5).......这件事可以分两步来做,先写一个函数,yield这个序列,在写一个函数驱动这个协程。function cofunc(table_x) coroutine.yield(2,table_x[2]) coroutine.yield(3,table_x[3]) coroutine.yield(5,table_x[5])...end驱动函数:function generate(table_x) 阅读全文>
发表于 @ 2008年12月25日 23:03:00|评论(loading...)|收藏
g='hi~'local g='hello!'for i=1,2 dolocal g=g..'1'print(g)end输出:hello!1hello!1
阅读全文>
发表于 @ 2008年12月25日 14:32:00|评论(loading...)|收藏
用PHP代理下载小说的时候,html扩展名全部被Google的浏览器保存成.php。这个很讨厌。用Lua写个脚本来解决吧。
require'lfs'
local sep = "\\"function renamedir(path)local i = 1 -- 这里是upvalue,每个子目录都不一样的哦,都从1开始数for file in lfs.dir(path) doif file ~= "." and file ~= ".." thenlocal f = path..sep..fileprint ("\t=> "..f.." <=")local attr = lfs.attributes (f)--assert (type(attr) == "table")if attr.mode == "directory" thenrenamedir(f)elseif f:find('php') thencmd = [[ren "]]..f..[[" ]]..[["txt]]..i..[[.html"]]i = i + 1print (cmd)os.execu阅读全文>
发表于 @ 2008年12月03日 00:53:00|评论(loading...)|收藏
http://elua.luaforge.net/tut_boot_lua.html阅读全文>
发表于 @ 2008年07月07日 19:46:00|评论(loading...)|收藏
Python的一个小技巧和Lua的Unpack比较
- classA(object):
- defsetline(self,line):
self.line=line
- defsetitem(self,a,b):
printa,b
- deff(self):
print(type(self.line[:2]))
self.setitem(*self.line[:2]) # 这里的*表示把一个list解成两个参数
a=A()
a.setline([1,2])
a.f()
输出:
>pythonw -u "t.py"
1 2
对应之Lua的用法:
- f=function(...)
print(...)
end
t={1,2}
f(unpack(t))
输出:
>luai "t.lua"
1 2 阅读全文>
发表于 @ 2008年05月12日 11:40:00|评论(loading...)|收藏
concurrentLua和copas以及luasocket集成的简单示例
require'concurrent'
require'cltime'
require'socket'
concurrent.setoption('trapexit',true)
local out=io.write
port=1888
nodename='master@linkerhp'
concurrent.init(nodename)
out('concurrent node name:'..nodename.."\n")
--tcpport=socket.tcp()
--tcpport:bind("*",port)
--tcpport:settimeout(0)
require'copas'
local tcphandlers={}
local function tcphandler(sock)
clientip,clientport=sock:getpeername()
sock=阅读全文>
发表于 @ 2008年05月06日 12:57:00|评论(loading...)|收藏
ConcurrentLua--面向并发的Lua编程 原文地址 Linker 翻译此文只为提供更多信息. 介绍 ConcurrentLua 是一个无共享异步消息传递模型的实现.该模型来自Erlang语言. 她改编了Erlang的并发元素并整合进Lua里. ConcurrentLua的一个核心元素是 process(进程).一个进程是一个轻量级虚拟机 线程,扮演和操作系统的进程同样的角色;他们不共享内存而是使用某这进程间通讯 机制.这些进程能够根据需要被创建和销毁,并通过一个简单的环罗宾(轮训)算法来 调度他们. 每一个进程关联到一个邮箱(临时存储消息的队列),通过邮箱来接受别的进程发来 的消息.进程可以在任何时候检查自己的邮箱有没有新消息抵达,如果有,进程可以 按照抵达的顺序依次读取. 每个进程都有一个唯一的数字作为进程标识,叫 PID(process identifier).也可以 给进程取一个名字,并用名字来指代进程.进程名和进程的对应关系被保存到一个 中心储藏室--registry(注册表).进程可以编辑注册表,添加或者删除表项. 错误捕捉机制也被实现成 阅读全文>
发表于 @ 2008年04月21日 13:43:00|评论(loading...)|收藏
LuaJIT的功能 原文地址 Linker 翻译此文只为了提供更多信息. LuaJIT试图保留Lua的精髓--轻量级,高效和可扩展. 功能 所有的函数缺省会被JIT(即时编译器)编译到本地机器码: * 没有被使用的函数不会被编译. * 可以选择性打开和关闭即时编译函数,子函数甚至整个模块. * 需要解析的函数(译注:即没有被编译的函数)和编译过的函数可以自由的混合使用. 预编译(Ahead-of-time AOT)也是被支持的: * 一些API函数和命令行选项允许用户全盘控制编译过程 这个即时编译器是可扩展的: * 优化器是一个外部模块可以附着在编译器流水线上. * 一些模块提供了关于编译过程的跟踪和调试信息. * 所以这些功能可以通过命令行参数来激活. 性能 被编译的机器码是非常高效的: * 先请看一下性能对比测试 * 在任何可以采用的地方采取了侵入性优化措施(特殊化,内联).内联的约定(contracts)在运行时捕获错误的优化预测(未发现的多态). * 自适应去优化被用来重新编译那些破坏了约定的字节码指令.这避免了生成普通的低效率的通用代码(更快速编译,减少指令缓阅读全文>
发表于 @ 2008年04月19日 11:36:00|评论(loading...)|收藏