The Dala Formula Language is a light weight language, that is heavily inspired by Excel and Google Sheets formulas, for example: SUM(1, 2, 3, 4, 5) will yield 15.
It is currently a work in progress.
You can use the dala::eval To evaluate a Dala from expression inside a Rust program. For example:
use dala::{eval, DalaValue};
let result = eval("CONCAT(\"Hello\", \" \", \"World\")");
let DalaValue::Str(value) = result[0].as_ref().unwrap() else { panic!("Not a string") };
assert_eq!(value, "Hello World");The eval function takes a string slice and returns a Vec<Result<DalaValue, DalaError>>, with the result of each expression that was evaluated.
The DalaValue enum represents the possible values that can be returned from a Dala expression: a Str, a Num or a Boolean.
The DalaError enum represents the possible errors that can occur during the evaluation:
BuildError: returned when there is an processing the Dala Expression, before its evaluation.RuntimeError: returned when there is an error during the evaluation of the Dala Expression.ParseError: returned when there is an error parsing the Dala Expression.
You can try out the language on our Repl, by using this command: cargo run -p repl.
Once it is running, just type in your Dala Expression and press enter to evaluate it, for example:
> CONCAT("Hello", " ", "World")
"Hello World"These primitive values are used as arguments and as return values from functions.
| Primitive | Description | Syntax |
|---|---|---|
Str |
A string of characters enclosed by double quotes | "Hello World" |
Num |
A number | 1, 2.5, 3.1415 |
Boolean |
A boolean value | TRUE, FALSE |
Each function can take primitive or other functions as arguments.
| Function | Syntax | Example | Description |
|---|---|---|---|
EQ |
EQ(a, b) -> Boolean |
EQ(1, 1) -> TRUE |
Returns TRUE if the arguments are equal, otherwise returns FALSE |
NEQ |
EQ(a, b) -> Boolean |
EQ(1, 1) -> FALSE |
Returns TRUE if the arguments are different, otherwise returns FALSE |
CONCAT |
CONCAT(a, b, c, ...) -> Str |
CONCAT("Hello", " ", "World") -> "Hello World" |
Concatenates all the arguments together into a single string |
DIVIDE |
DIVIDE(a, b) -> Num |
DIVIDE(10, 2) -> 5 |
Divides the first argument by the second argument |
IF |
IF(condition, if_true, if_false) -> Lit |
IF(TRUE, "Hello", "World") -> "World" |
If the condition is true, evaluates if_true, otherwise evaluates if_false |
MULTIPLY |
MULTIPLY(a, b) -> Num |
MULTIPLY(5, 2) -> 10 |
Multiplies the arguments |
SUBTRACT |
SUBTRACT(a, b) -> Num |
SUBTRACT(1, 2) -> -1 |
Subtracts the second argument from the first |
SUM |
SUM(a, b, c, ...) -> Num |
SUM(1, 2, 3, 4, 5) -> 15 |
Sums all the arguments together |
UPPER |
UPPER(a) -> Str |
UPPER("Hello World") -> "HELLO WORLD" |
Converts the string to upper case |