Lola: a new, but powerful scripting language - tests and reviews are welcome

Intro

I know this code is bad, for many, many reasons. But it's working..:slight_smile:

Please report bad things on the following gitlab repos. Thanks!

Lola

I had a dream about adding meters with kilometers, or km/h with m/s...
Now I can, with my first Rust programming language, lol :slight_smile:

I named it "Lola", because it is "lol" => really bad implementation here, still learning...

However, it has many features:

  • high precision numbers, thanks to rug
  • handles something like 95% of the SI units
  • variables,
  • loops,
  • condition statements,
  • user-defined functions,
  • arrays,
  • exceptions,
  • scopes,
  • anonymous functions,
  • ... lol!

Lola code example

// Returns the given string, repeated n times.
fn repeat_str(s: string, n: int) {
    let output = "";
    for n { output += s }
};

// Returns an array, each value having been mapped by the given function.
fn map(a: array, mapper: function) {
    let output = [];
    for v in a {
        output += mapper(v)
    }
};

input = [ "Hi", "!" ];
output = map(input, fn(s) repeat_str(s, 3));
print(output);

input = [ 2.55 km, 50cm + 700mm ];
// Tip: the "~" operator converts a value to the given unit, if possible:
output = map(input, fn(v) v ~m);
print(output);

Output of the above lola code example:

[ HiHiHi, !!! ]
[ 2550 m, 1.2 m ]

A working inline version

Be prepared for 500 or 404 responses, sorry!

http://lola.ligux.fr

The actual website frontend is written in french... But all the docs are written in english.

Code

In order to make it usable, and to learn more about Rust, I built four different projects:

lola: the core lib

The most stable project, as far as I know, and the base of all the other projects;

lola-cli: interactive cli tool

An interactive cli tool which runs Lola code (wrapper over the core lib);

lola-server: API which runs Lola code and persist it into "sessions"

An API which can run Lola code, and persist it in a database while adding the concept of "session"
(thanks to rocket.rs and diesel.rs, and using the core lib);

lola-front: a web frontend

Powered by Symfony, which needs lola-server (just in case: if the lola API is down, get prepared
to 500s, lol!)...

Wow, this look nice. I think you're way past the so-called newbie state now :slight_smile:

Did you evaluate Rust libraries that lets you work with SI units? I found uom (short for "units of measurement"). How does your language compare to such a library?

The syntax of the language might be the biggest difference? If I'm guessing right, Lola lets you write

    let length = 5.0km;
    let time = 15.0s;
    let velocity = length / time;

vs real Rust:

    let length = Length::new::<kilometer>(5.0);
    let time = Time::new::<second>(15.0);
    let velocity = length / time;

Yes, uom seems to be a very nice crate; I didn't try it for this project, because it implements zero-cost types, which are fixed on compile time, and I wanted to be able to add custom types dynamically, on runtime. In terms of performance, the lola scripting language is far, far away from the gain of using zero-cost rust crates directly, but it's not the goal.

EDIT

To give more precisions about this, giving the ability to add custom units is a latent feature in the code (thanks to not using compile-time structures), but it's not available for now...

When thinking about it and by considering the actual code, I can understand that it requires a parse in two passes : indeed the actual parser needs to be aware of all the existing units; if some custom unit definitions are allowed, then these definitions have to be processed before the main parse. It looks a bit like C preprocessor directives, in the way that they must be parsed before everything else.