5.3.0
Main changes:
- Interpreter mode to run on Android or other not-standard JVM.
- Fixed assign and define operator can’t work when enable TRACE_EVAL. #408
Implements ApplicationContextAware for SpringContextFunctionLoader. Now SpringContextFunctionLoader can be managed by spring container.
5.2.7
Fixed:
A concurrent issue in
Expression#getVaraibleNamesandExpression#getVaraibleFullNames.Should throw no such property exception if propert not found when using variable
a.b.cdot syntax.5.2.6
A strongly recommended upgrading version if you are using 5.x versions.
Main changes:Fixed:
- New features:
- New function: partial(f, &args) that takes a function f and fewer than the normal arguments to f, and returns a fn that takes a variable number of additional args. When called, the returned function calls f with args + additional args.
- Use soft reference for caching reflection result #386
- Added key info to exception message when sequence is null in seq.get function.
5.2.5
Main changes:
- Auto convert java boxing types into aviator number types when invoking java methods #369
- Adds a calcuator example which evaluate arithmetic expression in string.
- Bug fixes: can’t call overload getter/setter by reflection #368
Used array-based hashmap for internal env to reduce memory consumption.
5.2.4
New features:
Define anonymous function by
fnsyntax (instead oflambda ... -> ... end),let add = fn(x, y) { x + y); add(1, 2)for example.- Unpacking arguments(as sequence) by
*argssyntax like python, for example: ```javascript fn test(a, b, c, d) { a b + c d } let a = tuple(1, 2); let list = seq.list(3, 4);
p(test(a, list));
- Adds `AVIATOR_DEPS` environment variable to point third-party jar files directory for `aviator` shell command-line, default is `$HOME/.aviatorscript/deps` , all jar files under this directory will be added to JVM `CLASSPATH` .- Improve `for` statement, supports index( List/Array sequence etc.) and key/value(Map) iterating:```javascriptlet a = tuple(1, 2, 3, 4, 5, 6, 7, 8, 9);for i, x in a {assert(i + 1 == x);}let m = seq.map("a", 1, "b", 2, "c", 3);for k, v in m {if k == "a" {assert(v == 1);}elsif k == 'b' {assert(v == 2);}elsif k == 'c' {assert(v == 3);}else {throw "should not happen";}}
seq.array_of(Class, dimension1, dimension2, ...dimensions)to create a multidimensional array.- New functions to add/retrieve/remove object’s metadata: ```javascript let a = 1; p(meta(a)); ## retrieve meta ,null if not found
associate key/value metadata to any objects by with_meta(obj, key, value)
a = with_meta(a, “key”, tuple(1, 2, 3));
p(meta(a)); ## {“key” => [1, 2, 3]} p(meta(a, “key”)); ## [1, 2, 3]
remove metadata by without_meta(obj, key)
a = without_meta(a, “key”); p(meta(a));
- Bugs fixed:- Wrong size number of `Range` .- JUnit dependency issue, Thanks to [DQinYuan](https://github.com/DQinYuan)<a name="GvBuB"></a>## 5.2.3Main changes:- Removed commons-beanutils [#340](https://github.com/killme2008/aviatorscript/issues/340)- Fixed `AviatorString#toString()` may print warning message.- Fixed missing source file and line number in string interpolation expression when throws exception.- New function `is_distinct(seq)` returns true when a sequence doesn't have duplicated elements.- Focus on performance turning:
Aviator 5.2.3: Benchmark Mode Cnt Score Error Units PerfBenchmark.testArith thrpt 5 108126.155 ± 6304.752 ops/ms PerfBenchmark.testArithByAviator thrpt 5 2565.933 ± 105.076 ops/ms PerfBenchmark.testArithByBeetl thrpt 5 1625.887 ± 291.247 ops/ms PerfBenchmark.testArithByScript thrpt 5 7050.305 ± 69.529 ops/ms PerfBenchmark.testCond thrpt 5 93099.759 ± 8554.585 ops/ms PerfBenchmark.testCondByAviator thrpt 5 1667.093 ± 112.807 ops/ms PerfBenchmark.testCondByBeetl thrpt 5 1617.045 ± 93.373 ops/ms PerfBenchmark.testCondByScript thrpt 5 6926.106 ± 267.292 ops/ms PerfBenchmark.testObject thrpt 5 8537.937 ± 272.512 ops/ms PerfBenchmark.testObjectByAviator thrpt 5 1025.725 ± 30.846 ops/ms PerfBenchmark.testObjectByBeetl thrpt 5 860.873 ± 33.559 ops/ms PerfBenchmark.testObjectByScript thrpt 5 4552.307 ± 199.507 ops/ms
Aviator 5.2.2: Benchmark Mode Cnt Score Error Units PerfBenchmark.testArith thrpt 5 105095.308 ± 3861.646 ops/ms PerfBenchmark.testArithByAviator thrpt 5 2405.785 ± 78.325 ops/ms PerfBenchmark.testArithByBeetl thrpt 5 1628.726 ± 45.332 ops/ms PerfBenchmark.testArithByScript thrpt 5 7513.704 ± 286.090 ops/ms PerfBenchmark.testCond thrpt 5 92518.914 ± 1961.141 ops/ms PerfBenchmark.testCondByAviator thrpt 5 952.022 ± 32.184 ops/ms PerfBenchmark.testCondByBeetl thrpt 5 1647.736 ± 19.300 ops/ms PerfBenchmark.testCondByScript thrpt 5 7631.465 ± 404.298 ops/ms PerfBenchmark.testObject thrpt 5 8847.069 ± 261.799 ops/ms PerfBenchmark.testObjectByAviator thrpt 5 873.944 ± 26.327 ops/ms PerfBenchmark.testObjectByBeetl thrpt 5 826.758 ± 30.071 ops/ms PerfBenchmark.testObjectByScript thrpt 5 4647.178 ± 237.783 ops/ms
- Benchmark improvements:- testArithByAviator 6.7%- testCondByAviator 75%- testObjectByAviator 17.4%<a name="Km984"></a>## 5.2.2Main changes:- Fixed `Expression#getVariableNames()` and `Expression#getVariableFullNames()`, they will return the global uninitialized variable names. [#277](https://github.com/killme2008/aviatorscript/issues/277) [#335](https://github.com/killme2008/aviatorscript/issues/335)- Adds `AviatorEvaluatorInstance#setCachedExpressionByDefault(boolean)` to configure whether to cache the compiled expression by default when invoke `compile(string)`, `execute(string, [env])` methods etc, default value is false. [#330](https://github.com/killme2008/aviatorscript/issues/330)- Adds a new option `Options.ALLOWED_CLASS_SET` with a `Set<Class>` value to control the allowed class list in new statement and static method/field invocation. [#325](https://github.com/killme2008/aviatorscript/issues/325)- Adds new features `Feature.StaticFields` and `Feature.StaticMethods`. [#326](https://github.com/killme2008/aviatorscript/issues/326)<a name="VyeqF"></a>## 5.2.1If you are trying 5.2.0, please upgrade to this verson.1. New Features:- [Access java class's static methods by reflection,](https://www.yuque.com/boyan-avfmj/aviatorscript/xbdgg2#rjNeD) `Long.parseLong("3")` for example. You must `use` the class at first.2. Breaking changes:- String interpolation only works on **literal string in script**. Runtime string will not work.3. Fixed:- Weak reference queue memory leak in reflector.- String interpolation compile error in some corner cases.- Locked `commons-beanutils` version to 1.9.4<a name="OA0z5"></a>## 5.2.0**Deprecated, please use 5.2.1**1. **New Features:**- function overloading by parameter count, see [function_overload.av](https://github.com/killme2008/aviatorscript/blob/master/examples/function_overload.av).- variadic function by define variable parameter by prefixed with `&` , see [function_varargs.av](https://github.com/killme2008/aviatorscript/blob/master/examples/function_varargs.av).- use statement to import java classes, such as `use java.util.Date;` , see [use.av](https://github.com/killme2008/aviatorscript/blob/master/examples/use.av).- access class static variables by `.` , for example `Math.PI` , see [static_vars.av](https://github.com/killme2008/aviatorscript/blob/master/examples/static_vars.av).- access or assign map's value by `m[key]` syntax, the key can be a object or expression.- when use [aviator commandline](https://www.yuque.com/boyan-avfmj/aviatorscript/ma3zs3), there is a new internal variable `__MODULE__.dir` represents the file's current directory absolute path.You may use it in `require` for example:```javascript## examples/test_qsort.avlet q = require(__MODULE__.dir + '/qsort.av');fn rand_list(n) {let a = seq.list();for i in range(0, n) {seq.add(a, rand(n));}return a;}let a = rand_list(20);println("before sorting: " + a);q.sort(a);println("after sorting: " + a);
The you can run the script by command aviator examples/test_qsort.av , you don’t need to change the work directory into examples as before.
New Functions:
- more sequence functions:
take_while(seq, pred)to take elements in sequence withpred(x)is true.drop_while(seq, pred)to drop elements in sequence withpred(x)is true.concat(list1, list2)to concat two sequences.group_by(seq, keyfn)to group elements bykeyfn(x).distinct(seq)to return a sequence of the elements of coll with duplicates removed.sort(seq, comparator)to sort sequence with ajava.util.Comparator.reverse(seq)to return a seq of the items in coll in reverse order.seq.keys(map)to return the key set of map.seq.vals(map)to return the value set of map.zipmap(keys, vals)to return a map with the keys mapped to the corresponding vals.
- more math functions:
math.atan(x)math.acos(x)math.asin(x)math.ceil(x)math.floor(x)
- more internal functions:
is_a(val, class)Returns true when the value is a intance of the class, for exampleis_a("a", String)returns true.comparator(pred)Returns an implementation of java.util.Comparator based upon predicate.repeat(n, x)Returns a list of x which it’s lenght n.repeatedly(n, fn)thefnfunction takes no args, and returns a sequence of calls to it inntimes.constantly(x)Returns a function that takes any number of arguments and returns x.
- more sequence functions:
Improvements:
- improve error reporting, adds source file and source line number.
- performance tweak for variable syntax suger such as
a.b.cora.b[10].cetc, replace thecommons-beanutilsby default, almost 2x speed up. - Checking if function name is reserved when parsing script.
- Reduce memory consumption.
