试将消息当做预先设想到的流的一部分。与语法分析类似,在设计 Parser 的阶段,并不清楚 TokenStream 下一个 token 会是什么,但由于预先知道 token 的类型,故可从容面对。
将程序视为由消息在驱动是一种急促的思路,与此对应的是语法分析的思路。有多少种消息类型,能处理多少种消息类型,这是预先可以预见到的。在何种状态会接收到什么消息,也是可以预见的。因此,可以将状态机转化为相当于流处理的动作机。这种做法体现在 uniguard-connection 的连绵处理器的设计中,另外,在 naggati scala 中,分包的 step 也有类似的设计。如果将 erlang 视为声明式的语言,由于它可以更换接收函数,亦可认为做到了同等的效果。
唯需要注意的是,由于一个语法分析器实际上只处理一段叙述。在采用语法分析器模式对付消息时,由于消息类型不同,相应的叙事内容也不同,因此,根据消息分类,可以衍生出若干连绵处理器。这样一来,在按这种方式设计时,在消息分派程序中,按消息类型决定应该分派到哪个连绵处理器。
不应考虑两个叙事混杂的情况。如两个叙事混杂,从设计上事先应该隔离,如任务增加任务id。
实现:
连绵处理器虽然可行,但代码过于冗长,应该有办法缩减。和语法分析器的方式对比:
function parse(tokens){
match('if')
match('(')
condition(tokens)
match(')')
}
function condition(tokens){
// more and more
}
由于不涉及异步,故无需回调,因此这种方式简单优雅。
不妨采取以下形式:
parse(match('if'), match('('), condition(tokens), match(')'))
parse 函数是一个 combine 函数,其自动为每个 match 生成 id,当消息箱中没有更多的消息时,就一层一层挂起,待收到消息后,从这个挂起的 id 继续执行,这种 combine 函数需要能嵌套,以便在内部仍可以挂起。因此,match 函数也是一个 combine 函数。 此外,还需要用于分支的 cond, if,逻辑 combine,and, or,以及支持迭代 while。这种思路形似 sicp 中的 delay 机制。
一个简单的发送短信过程如下:
sequence(
login(username, password),
cond(
match('success',
sendmessage('hello'),
cond(
match('success', log('success')),
match('failed', log('failed'))
),
logout()
),
match('failed', log('log failed'))
)
)
这个做法更适合漫长的消息交互,适合表现序列图。当然,这会比状态机耗费更多的资源。
以这种方式理解,每个设备是这样一个处理器:
sequence(
promptLogin(),
login(givenUsername, pwd),
loop(
match()
)
)
分享到:
相关推荐
power delay profile simulation
个人整理的文档,有详细的步骤。 使用于XILINX FPGA的PIN DELAY导入ALLEGRO
按键检测代码,采用delay_ms方式,进行延时防抖。优点是不需要等到按键弹起就可以检测,缺点是会产生delay阻塞。 2. 使用说明: 通过修改宏定义可以修改开关时间; 通过查看头文件可以方便移植到不同硬件上; 3. ...
keil5 delay.h 头函数
stm32 延迟的源代码 delay.h 包含 sys.h 使用时包含进工程目录
startdelay_v2.5
STC15系列万能delay延时。为了方便51单片机在不同晶振频率下,延时函数能正常使用而打包的延时函数。改变频率后只需改变一下宏定义即可。 delay.h #ifndef _DELAY_H #define _DELAY_H //注意时钟频率设置...
非中断式精准延时 void delay_us(uint16_t us); void delay_ms(uint16_t ms); void delay_s(uint16_t s); 中断式精准延时 void Delay_us(uint16_t us); void Delay_ms(uint16_t ms); void Delay_s(uint16_t s);
How to define delay in Verilog
allegro高速信号添加PIN_delay的详细步骤,这是自己使用时整理出来的,可能会有不足的地方。
Introduction to Time-Delay Systems Analysis and Control Emilia Fridman
delay函数的主函数
Standard Delay Format Specification version 2.1
Scheme to MeasureOne-Way Delay Variation with Detection and Removal of Clock Skew
Allegro 软件Pin Delay 导入导出及校验方法介绍
封装成模块的延迟函数,使用时进入延迟,不会中断程序,仅仅是延迟执行下一行代码
关于哈姆莱特delay性格的一篇论文 1. Introduction 1 1.1 Brief introduction of William Shakespeare 1 1.2 The General Introduction of the Story 2 2. The Tragedy of Characters 3 2.1 The Tragedy of Hamlet 3...
软件延迟头文件 Delay.h
delay延时程序 多文件调用 keil 软件应用
前端开源库-await-delay等待延迟,使用delay/sleep异步/等待ES7