oters_lang 0.1.8

Language definitions and interpreter for the oters programming language
Documentation
extern crate oters_lang;

use oters_lang as oters;

use anyhow::Result;
use oters_lang::export::{export_list, export_oters};
use oters_lang::interpret::Interpreter;
use oters_lang::parser;
use oters_lang::types::check::ProgramChecker;

#[export_oters]
fn print_int(i: i64) {
    println!("{}", i);
}

#[export_oters]
fn contains(xs: Vec<i64>, v: i64) -> bool {
    xs.into_iter().find(|x| x == &v).is_some()
}

export_list!();

fn main() -> Result<()> {
    let source = std::fs::read_to_string(std::path::Path::new("examples/ex2.otrs"))?;
    let program = parser::parse_source(source.clone()).map_err(|e| e.to_anyhow(&source))?;
    let mut checker = ProgramChecker::new();
    println!("{:?}", EXPORT_FNS.clone());

    checker
        .type_check_program(
            &program,
            vec!["ex2".to_string()],
            Some((
                EXPORT_FNS.clone(),
                EXPORT_STRUCTS.clone(),
                EXPORT_ENUMS.clone(),
            )),
        )
        .map_err(|e| e.to_anyhow(&source))?;

    let mut interpreter = Interpreter::new(
        checker.checked_exprs,
        EXPORT_FNS
            .clone()
            .into_iter()
            .map(|(name, val)| ((vec!["ex2".to_string()], name), val))
            .collect(),
        vec!["ex2".to_string()],
    )
    .map_err(|e| e.to_anyhow(&source))?;
    loop {
        interpreter.eval_step().map_err(|e| e.to_anyhow(&source))?;
    }
}