zookd
v0.2.3
Published
An expression language that is compiled to JavaScript.
Downloads
28
Readme
zookd
An expression language that is compiled to JavaScript.
The lexer and parser are greatly inspired by CoffeeScript.
Syntax
Null
Represents null
in JavaScript.
zookd.eval('null'); // => null
Identifier
- Identifiers may only include the following characters: letters (
'a'..'z'
,'A'..'Z'
), digits ('0'..'9'
), underscores ('_'
) and dollar signs ('$'
). - The first character must not be a digit.
- The identifier must not be one of the keywords (such as
null
).
All the identifiers should be declared in the context.
zookd.eval.call({ foo: 'bar' }, 'foo'); // => 'bar'
zookd.eval.call({ 'if': 42 }, 'if'); // => 42
Literal
In zookd, there are 5 types of literals: Numbers, Booleans, Strings, Lists and Maps.
Number Literal
Number literals are decimal numbers.
zookd.eval('1'); // => 1
zookd.eval('2.'); // => 2
zookd.eval('-.5'); // => -0.5
zookd.eval('-0'); // => -0
zookd.eval('1 / 2'); // => 0.5
zookd.eval('3 * (4 + 5)'); // => 27
zookd.eval('-1 / 0'); // => -Infinity
zookd.eval('~-1'); // => 0
zookd.eval('1 & 3'); // => 1
zookd.eval('1 ^ 3'); // => 2
zookd.eval('1 | 3'); // => 3
Boolean Literal
Boolean literals represent true or false.
zookd.eval('!false && false || true'); // => true
zookd.eval('!!false'); // => false
String Literal
String literals represent strings.
zookd.eval('"zoo" + "kd"'); // => 'zookd'
List Literal
List literals represent arrays in JavaScript.
Note that trailing comma and empty element are not allowed in zookd.
zookd.eval('[ [ 1, 2 ], "foobar" ]'); // => [ [ 1, 2 ], 'foobar' ]
Map Literal
List literals represent plain objects in JavaScripts.
zookd.eval('{ foo: { "bar": [ "baz" ] } }'); // => { foo: { "bar": [ "baz" ] } }
Lambda Expression
Lambda expressions are anonymous functions that transform some values to another ones.
let ctx = { map: (target, fn) => target.map(fn) };
zookd.eval.call(ctx, 'map(map([ 1, 1, 1 ], (val, index) => index + 1), val => val * 2)');
// => [ 2, 4, 6 ]
Property Accessors
Properties can be accessed with dot notations or bracket notations.
let ctx = { foo: { bar: { baz: [ 10, 42 ] } } };
zookd.eval.call(ctx, 'foo.bar["baz"][foo["bar"].baz.length - 1]'); // => 42
Function Call
A function in the top level of the context can be called.
let ctx = {
sum: numbers => numbers.reduce((a, b) => a + b, 0)
};
zookd.eval.call(ctx, 'sum([ 1, 2, 3 ])'); // => 6
API Reference
compile(expression)
Compile an expression to a JavaScript function which returns its value.
let fn = zookd.compile('1 + 2.5');
fn.toString(); // => 'function anonymous() {\nreturn 1 + 2.5;\n}'
fn(); // => '3.5'
eval(expression)
Compile and evaluate the expression.
zookd.eval('"Hello zookd!"'); // => 'Hello zookd!'