Releases: killme2008/aviatorscript
Releases · killme2008/aviatorscript
Aviator 4.0.0-RC 发布
本次发布是一个大版本升级,主要改进如下:
- 多行表达式支持,以分号
;
隔开的多个表达式,求值结果将是最后一个表达式的值。 - 支持 lambda 定义匿名函数,支持闭包捕获。自定义函数可以通过 lambda,举例如下
AviatorEvaluator.defineFunction("s",
"lambda(x) -> lambda(y) -> lambda(z) -> x + y + z end end end");
AviatorEvaluator.exec("println(s(4)(5)(6))");
filter
、map
等高阶函数也支持使用 lambda 替代原有的谓词函数:
Map<String, Object> env = ...
int [] a = ...
env.put("a", a);
AviatorEvaluator.execute("map(a, lambda(x) -> x + 1 end))");
-
新增两个选项
ENABLE_PROPERTY_SYNTAX_SUGAR
,是否启用属性访问的语法糖,例如a.b.c
的变量访问是否走 commons-beanutils 反射访问,默认启用为true
。禁用后,这类变量将直接从 env 获取。NIL_WHEN_PROPERTY_NOT_FOUND
,当启用属性语法糖的时候,如果调用反射失败,默认行为是抛出异常,通过启用这个选项,将直接返回 null,忽略异常。
-
支持求值器多实例,可以通过
AviatorEvaluator.newInstance()
创建求值器实例AviatorEvaluatorInstance
,不同求值器之间的选项、自定义函数等不共享。原有的AviatorEvaluator
只是一个全局静态实例。 -
修复字符串类型转义符支持。
-
新增
FunctionLoader
接口用于自定义函数加载
public interface FunctionLoader {
public AviatorFunction onFunctionNotFound(String name);
}
可以添加自定义函数加载器到求值器实例 AviatorEvaluator.addFunctionLoader(loader)
。默认新增提供了一个 SringContextFunctionLoader
,可用于从 spring 容器加载自定义函数。
seq.filter
函数现在支持 Map 类型集合的迭代过滤。seq
的谓词函数都支持第三个参数,用于做属性过滤,参见测试用例。- 新增两个内置的特殊变量:
#__env__
表示运行环境的 env 上下文。#__instance__
表示当前运行的求值器AviatorEvaluatorInstance
实例。
- 新增函数
boolean(v)
,可将其他类型的值转成布尔类型,除了 nil/false之外,其他值都将为 true。 Opitons.TRACE_EVAL
跟踪运行,支持函数调用跟踪。- 语法错误信息改进,标记错误的表达式位置。
兼容性问题
- 如果现有自定义函数名是 lambda,将无法正常使用,请使用其他名字。
- 新版本将不再修改用户传入的 env ,如果需要依赖这个行为,请使用返回值的方式。
Aviator 3.3.0 发布
主要特性:
- 支持运算符重载,参见开发指南。
- 新增选项
Options.TRACE_EVAL
,打开后可跟踪调试求值过程,该选项极大地影响性能,并且将关闭逻辑运算符的短路运算,请不要在生产环境打开。 - 新增选项
Options.PUT_CAPTURING_GROUPS_INTO_ENV
,是否将正则匹配捕获的分组放入env
,默认打开。可关闭提升正则匹配性能。 - 废弃选项
ALWAYS_USE_DOUBLE_AS_DECIMAL
,这是个命名错误,请使用新选项ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL
替代。 - 更新了开发指南,补充新增功能说明。
<!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.3.0</version>
</dependency>
Aviator 3.2.0 发布
主要变更:
- 不再兼容 JDK6 及以下版本,要求使用 JDK7 或者更高版本。如果需要继续在 JDK6 使用,请使用老版本。
- 引入环境变量
aviator.preferClassloaderDefiner
,默认为false
,表示是否继续使用ClassLoader#defineClass
的方式来定义表达式类,默认将优先使用sun.misc.Unsafe#defineAnonymousClass
方法。 - 由于优先使用
sun.misc.Unsafe#defineAnonymousClass
,编译性能更好(没有 ClassLoader 加载校验等环节),表达式编译后的匿名类将可以被 GC 正常回收,解决在编译大量动态表达式的时候导致的内存消耗膨胀问题。
<!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.2.0</version>
</dependency>
Aviator 3.1.1 发布
- 修复 AviatorString 比较运算符存在的 NPE 异常,参见 #31
- 升级 ASM 库,移除 trace 字节码功能,废弃
Options.TRACE
。整个库不包括依赖库大小缩减到 289 K。
Aviator 3.1.0 发布
主要更新如下
- seq 库增加了一些高阶函数
seq.every
、seq.not_any
和seq.some
,以及逻辑组合函数,用于返回复合谓词,例如seq.and(seq.gt(3), seq.lt(10))
等, 例如:
//检测数组每个元素都在 0 <= e < 10 之间。
AviatorEvaluator.execute("seq.every(a,seq.and(seq.ge(0), seq.lt(10)))", env);
see #18
- 增加方法
Expression#getVariableFullNames
,用于返回表达式原始的变量名列表, see #21 - 支持引用变量(quote variable),用于使用深度嵌套的变量,例如
#a.b[0].c
,变量名要求以#
开始, see #19
Maven 使用:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.1.0</version>
</dependency>
或下载二进制文件。
Aviator 3.0.1 发布
主要变更:
- 数组访问支持方法调用结果或者表达式结果,参考 #15
3.0.0 发布
改进如下:
- 支持从文件配置加载自定义函数列表,参考 加载自定义函数。
- 新增 AbstractVariadicFunction,方便实现不定参数的自定义函数,只要实现下列接口即可:
public abstract AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args);
- 增加内置函数:
math.round
等同于 Math.round 方法,以及rand(n)
用于产生一个 [0-n) 之间的整数。 - 改进了
rand
函数实现,更安全和高效。 AviatorObject
增加boolean isNull(Map<String, Object> env)
用于判断运行时值是否为 null。
2.3.7 发布
2.3.6 发布
2.3.5 发布
- 修复部分科学计数法数字解析错误。