fomoscript

Toy scripting language, built with Rust

Only a few days old. Not production ready. The goal is to use it in Fomos as a shell.

* except log, doesn't count ;)

Examples

Simple script

java { let x = 0 while x<5 { x = x+1 } x }

returns 5

Support of higher order functions

java { let x = 0 let f = (e) => {e+1} let g = (f,e) => f(e) g(f,x) }

returns 1

Use in Rust

Step 1: have some code

rust let code: Vec<char> = r#" { let x = 0 while x<5 { x = x+1 } x }"# .chars() .collect();

Step 2: parse it

rust let ast = parse_ast(&code).expect("parse ok");

Step 3: run it

rust let mut ctx = Ctx::new(ast); let result = eval(&0, &mut ctx);

The result will have this type.

Go see the tests for more examples.

By default, there is no side effect possible from the script during eval (except inside ctx)

You can insert native rust closure with (or without) side effects into the script, and use it from there. Example with the print function:

```rust let code: Vec = r#" { myprint(1+1) } "# .chars() .collect(); let ast = parseast(&code).unwrap(); let mut ctx = Ctx::new(ast);

let printclosure = Rc::new(|a: N, _, _, _| { println!("{}", a.tostr()); N::Unit }); ctx.setvarabsolute("myprint", N::FuncNativeDef(Native(printclosure)));

let _ = eval(&0, &mut ctx); ```

Cruelly missing

Also the inner workings are not very rust-like, no unsafe though ;)