|
发表于 2015-4-22 09:45:42
|
显示全部楼层
本帖最后由 littleknife 于 2015-4-22 10:12 AM 编辑
wait.lua是MUSH自带的一个协程建立工具而已。其核心是还是应用lua自身的协程函数 coroutine.create()来实现协程应用。
(1)、这里我对协程的理解就是:跳出执行顺序单独执行的一段代码。其框架是wait.make(function()....... end)
也就是说,一个程序代码其执行逻辑是顺序执行(这里我的理解就是非异步),但是若打破这种执行顺序,比如主程序顺序执行,但某条件触发后需执行外接一段代码但是不影响主程序执行。这就需要协程来做,或者称多任务同时执行(lua只用协程没有线程,这里我的理解为异步执行)。主程序还在执行,同一时刻,协程也在执行的意思。
这里就衍生出两个问题:协程框架(wait.make)的建立打乱了程序的执行顺序,故此不能轻易应用wait.make(......)框架,以便保证主程序的可控性。
个人的理解:而如果已经用了wait.regexp,然后用coroutine.resume来做恢复就是有些混乱的写法了,混乱在于就是把MUSH的自带lua工具(wait.lua)和lua的自身协程混淆了。所以jarlyyn说其为误导代码,我很赞同。
(2)、wait.regexp的理解:他是wait.lua这个工具的一个方法。其实就是建立临时触发,并等待触发的到来。触发到来了就继续下面的代码,否则就处于挂起的状态(即程序暂停),当然,若你设定了失效时间,到了时间也会顺序向下执行主程序。
wait.regexp虽然是使得程序挂起,但是却可以人为的设定变量来继续执行。比如:
local l,w=wait.regexp("^[> |]*船来了|^[> |]*设定环境变量 duchuan=='没来'")
if l~=nil and string.find(l,"没来") then 没来干什么事情 end
if l~=nil and string.find(l,"船来了") then 来船了干什么事情 end。
所以要深刻理解wait.lua这个协程工具才能完全依靠它来做好机器。无须再在MUSH中建立触发。
(3)、故此,依上面的个人理解,如何实现过河并打坐的思路:
基本逻辑:
1)过河的主程序逻辑顺序:
过河程序开始--->过河进行中--->过河结束。
2)建立打坐的协程逻辑:
打坐开始--->达到打坐目的--->打坐结束。
3)建立状态判断:目的是何时执行打坐及何时打坐结束。[状态判断]
整体过河流程逻辑:
过河开始--->叫渡船(等待中返回某参数示意协程可以打坐了)[可以打坐]--->渡船到来[返回某参数示意协程打坐结束]---->上船,过河进行中[可以打坐]---->到达目的地[打坐结束]--->过河结束。
(4)为什么用wait.lua就可以做MUD的机器。其实就是因为wait.make可以针对机器的整体,而不用每个函数都做框架(wait.make)。故此,以wait为框架的MUD机器人就变成了任务流程的代码罗列了。 |
|