试将消息当做预先设想到的流的一部分。与语法分析类似,在设计 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...
生成的PIN DELAY文件通常包含了以皮秒(ps)为单位的时间延迟信息,但PCB设计软件Allegro要求使用密尔(mil)作为时间延迟单位。因此,需要对原始数据进行处理,以便能够被Allegro正确读取。 1. **计算平均值**:创建一...
在使用`delay.h`时,需要先包含`sys.h`以确保所有必要的系统配置已经完成。 7. **延时精度**:由于C语言的运行时环境和编译器优化,简单的循环计数方法可能无法实现非常精确的延时。为了提高精度,可以使用硬件...
Allegro 高速信号添加 PIN_delay 的详细步骤是指在设计高速信号约束时,需要将 PIN_delay 文件添加到 Allegro 中,以确保信号的延迟时间满足设计要求。下面是添加 PIN_delay 的详细步骤: 一、获取 PIN_delay 文件 ...
在VB(Visual Basic)编程中,开发者经常需要在程序中实现延迟执行某些操作的功能,以控制程序流程或等待特定事件的发生。通常,我们会使用`Sleep`函数来实现这个功能,但`Sleep`函数存在一些限制,它会阻塞当前线程...
本教程主要介绍了如何在Allegro中进行Pin Delay的导入、导出以及校验,以确保设计的准确性。 一、导入PIN DELAY的值 1. 首先,你需要准备一个CSV格式的文件,包含FPGA元件的引用设计ator(refdes)和设备值...
例如,在`delay.c`和`delay.h`文件中,可能会有一个`delay_ms()`函数,通过循环计数来实现一定时间的延迟。这样的函数通常由一个计数变量和一个循环结构组成,例如: ```c void delay_ms(unsigned int time) { for...
`await-delay` 是一个专为前端开发者设计的开源库,它提供了一种简单的方式来实现延迟操作,使得代码更加优雅且易于理解和维护。这个库巧妙地利用了 ES7 的 `async/await` 语法,使得异步编程更加同步化,避免了传统...
按键检测代码,采用delay_ms方式,进行延时防抖。优点是不需要等到按键弹起就可以检测,缺点是会产生delay阻塞。 2. 使用说明: 通过修改宏定义可以修改开关时间; 通过查看头文件可以方便移植到不同硬件上; 3. ...
《服务器启动延迟——深入解析startdelay_v2.3》 在服务器管理领域,优化系统启动流程以确保服务的稳定性和高效性是至关重要的。本文将深入探讨“startdelay_v2.3”这一工具,它是针对服务器启动延迟问题的解决方案...
在`main()`函数里,LED的初始化和控制逻辑会被编写,比如设置IO口为输出模式,然后通过调用`delay`函数来实现一定的延时,以达到灯闪烁的效果。 `delay.h`是一个头文件,它通常包含了函数声明和一些全局变量的定义...
keil5 delay.h 头函数
stm32f103 库函数版本 delay.c
在嵌入式系统开发中,延迟程序(通常称为delay或delay函数)是一个常见的需求,它允许程序暂停执行一段时间,等待某个事件的发生或者让其他任务有时间执行。在本主题中,我们将深入探讨“delay延时程序”,特别是...
头文件通常包含函数声明、宏定义和其他数据结构,供其他源代码文件(如"Delay.c")引用,以实现特定的功能。这里,我们重点讨论与"Delay.h"相关的知识点。 1. **头文件的作用**: 头文件的主要目的是提供一个接口...
* 实际应用中,对长时间(较简单任务一般指几十毫秒以上,对于复杂的应用,一般指几毫秒以上)的延时,应采用非阻断式的延时方式,或者使用定时器中断来完成延时。 delay 函数是 AVR 微控制器中经常使用的延时函数...
它允许程序在执行特定操作后等待一段预设的时间,或者在循环中插入等待,以实现定时或间隔控制。 1. **延时函数的基本原理**: 延时函数通常基于计数器或系统时钟进行工作。它会计算一定数量的系统时钟周期,达到...
通过StartDelay,用户可以有选择地设置哪些程序在计算机启动后多少时间再启动,或者设定特定的启动顺序,以优化系统性能。例如,你可以将那些对系统资源消耗较大的应用设置在其他轻量级软件启动后再运行,避免了系统...
1. **启动管理**:软件可能提供了一种方式来设置程序或服务的启动顺序和延迟时间,以优化系统资源的分配和使用。 2. **性能优化**:通过对启动过程的调整,可能可以减少系统启动时的卡顿,提高整体性能。 3. **...
本压缩包"delay10.rar_10秒verilog程序_Delay10_delay(10)_verilog 延时_verilog延时代"包含了一个特别的应用实例,即实现一个10秒的延时模块。这个模块对于理解和学习Verilog中的计数器和定时逻辑非常有帮助。 ...