很多网络应用中,涉及到一些内部运算的具体求值逻辑并不能够在开发阶段就定下来。这些逻辑需要随着使用,探测用户反应,不断修正。符合的情况,常见的就是网络游戏中的行动收获计算公式,等等。现 Spads 开发组推出了针对此种情况的解析公式系统,供大家使用。
此公式解析系统能够计算各种算术运算、逻辑运算和比较运算,可以连接本地函数,支持括号分级,允许逐级设置公式内临时变量,提供了分支运算符,并且支持 Json 数据格式的运算。系统编写中使用了很多设计方法,包括概念抽取、继承、多态、面向接口设计、枚举、递归、工厂等等。数据结构也使用了好用但少见的双端队列。很适合对应情况的实用以及学习 Java 的设计思路、编程方式。本程序由 Shane Loo LI 设计和编写,所有的细节都注重了运行效率,在很多细节上都制作了数倍优于爪哇(Java)系统类库的方法;由于只需要处理公式,所以语法树结构单一,也因此保证了比现有其它注入语言的代码解释器更高的执行速度。
下面来介绍一下公式解析系统的用法。
首先,公式通过 ?= 来给变量赋值。这种赋值并不是一个运算,而是公式每一行需要且只能出现一次的专属符号。
Result ?= 38 * 6
公式解析系统用 Result 来表示最终的结果。以上公式表示最终的结果为 228 。
本系统支持以下算术运算:
求负 -
加 +
减 -
乘 *
除 /
求余 %
乘方 ^
阶乘 !
比如
Result ?= ((2^5 - (-13)) % 10)!
能够得到 120 。
接下来,让我们看看公式系统的分支控制。
DayCount ?= 31
DayCost ?= 58.5
Limit ?= 1500
Result ?= DayCount * DayCost > Limit ? "超支了!" ~ "没超支"
我们看到整个公式分为四行。每行声明了一个变量。
实际上在这个公式系统中,并不严格要求上边的公式不能够使用下边公式声明的变量,但如果嵌套使用则会抛出异常。
上述公式将得到一个字符串,内容是“超支了”。
支持的有关运算如下:
大于 >
小于 <
等于 =
与 &
或 |
非 -(这个和 C 语言系列的 ! 有所不同)
条件 ?
分支 ~(这个和 C 语言系列的 : 有所不同)
这个系统最重要的特性,就是能够把公式中出现的函数,和本地函数绑定起来。
只需要制作 Function 接口的实现类,并且在 FunctionEnum 对其进行注册,就能够得到一种可以在公式中识别的函数。
我最近学习了“约定优于明示”的思想,近期会将这种 FunctionEnum 配置方式进行一定程度的更改。
比如,我提供了内置函数 TOGETHER ,其含义是以第一个参数为名称,第二个参数为值,构成键值对;第三个参数为名称,第四个参数为值,构成键值对;等等。最终将其组合成 Json 字符串。请看如下公式。
Name ?= "Shane"
Level ?= 16
Result ?= TOGETHER(\"name\", Name, "graduated", Level > 10 ? "毕业了" ~ "没毕业")
最终结果为 {"name": "Shane", "graduated": "毕业了"}
说了这么多公式解析系统的用法。现在来从编程角度介绍一下如何启用此系统功能。
首先,肯定是要导入 .jar 包。然后参看以下代码。
EvaluatorFactory factory = EvaluatorFactory.INST;
Evaluator eva = factory.getEvaluator("Result ?= 28 + 2 / 10.0");
ExpValue result = eva.evaluate();
System.out.println(result);
或者
String form = "Result ?= 28 + 2 / 10.0";
ExpValue result = EvaluatorFactory.INST.getEvaluator(form).evaluate();
首先,计算器工厂是单例的,但以后如果要扩展函数库,则可以改写成多种工厂。获取工厂后,传入公式字符串(多行),以通过工厂获取针对此公式的计算器。然后调用计算器的计算方法,即可获得公式最终的结果。
如有疑问,可以联系 Surmounting@gmail.com
项目包下载地址为: http://download.csdn.net/detail/shanelooli/4726670
本文也在我的 CSDN 日志中发表: http://blog.csdn.net/shanelooli/article/details/8142726
分享到:
相关推荐
此公式解析系统能够计算各种算术运算、逻辑运算和比较运算,可以连接本地函数,支持括号分级,允许逐级设置公式内临时变量,提供了分支运算符,并且支持 Json 数据格式的运算。系统编写中使用了很多设计方法,包括...
这款游戏的实现涉及到了多个领域的技术,包括计算机图形学、信号处理、机器学习(用于解析BCI信号)以及AR系统的构建。开发者可能使用了诸如Unity或Unreal Engine这样的游戏引擎来创建3D场景,利用BCI设备如EEG头盔...
本文就极微弱光探测的发展,简要说明了单光子探测器种类,分析了雪崩光电二极管(APD)用作单光子探测的工作原理及相关特性,全面地介绍了SPADs(Single-photonavalanchediodes)目前广泛采用的四种工作方式及其各自性能...
《模块化SPAD直接飞行时间深度传感器在宽动态范围场景中的分析》 随着深度感知需求的不断增长,光探测和测距(LiDAR)系统在各种应用中得到了广泛发展。基于时间相关单光子计数(TCSPC)的直接飞行时间(DTOF)图像...
- **参考SPADs**:读取之前保存的参考SPAD校准数据。 - **参考温度校准**:读取并应用之前的温度校准数据。 - **偏移量校准**:应用之前得到的偏移量值。 - **交叉交谈校正**:基于之前得到的数据进行校正。 - *...
3. 参考SPADs校准:为了优化系统的动态特性,需要执行参考SPADs校准。在STMicroelectronics的最终模块测试中,这个校准步骤是裸模块执行的。校准数据(包括SPAD的数目和类型)存储在设备的非易失性存储器(NVM)中。...
硅单光子雪崩光电二极管(SPADs)是一种利用内部增益提高感光灵敏度的光检测器件,在光学通信领域得到了广泛的应用。近来,由于单光子探测技术的发展,SPADs在量子通信、生物成像和激光雷达等领域的应用也变得尤为...
SiPM是一种新型的光电探测器,由大量的微光子探测单元(SPADs)组成。当NaI(Tl)晶体发出的荧光光子到达SiPM,每个SPAD单元都有可能产生雪崩光电效应,放大电信号。由于SiPM具有高灵敏度、低暗电流、紧凑尺寸等优点,...
Device simulation, I-V measurements, and dark count calculations and measurements demonstrate that tunneling is the main source of noise in NTGR, but it is less dominant in PTGR SPADs. All structures...
系统初始化/校准涉及数据初始化、静态初始化、加载校准数据和参考SPADs、温度校准、偏移校准及串扰校正。设备模式分为轮询模式和中断模式。 测量功能在文档中详细说明了测量的启动、数据就绪的等待、测量结果的获取...
We examine the saturation of relative current gain of In0.53Ga0.47As/InP single photon avalanche diodes (SPADs) operated in Geiger mode. The punch-through voltage and breakdown voltage of the SPADs ...
《VL53L5CX:超视距8x8多区测距传感器的全面解析》 VL53L5CX是一款先进的飞行时间(TOF,Time-of-Flight)传感器,其设计目标是实现高精度、多区域的测距功能,同时具备宽广的视场角。这种传感器的应用广泛,包括...
文章还详细介绍了实验过程和结果,对比分析了自由运行检测器和门控模式下的性能差异,发现前者在经过死时间校正和后脉冲校正后,性能可与门控模式相媲美。 文章中提到的关键词包括“单光子检测器”、“自由运行”、...
为了深入理解InGaAs/InP单光子雪崩二极管(SPADs)的后脉冲特性,我们需要从几个方面来探讨相关知识点。 首先,InGaAs/InP单光子雪崩二极管是近年来在众多研究领域中越来越受到重视的一种器件。特别是在电信波段...