scryer-prolog 0.8.51

A modern Prolog implementation written mostly in Rust.
#[macro_use] extern crate cfg_if;
#[macro_use] extern crate downcast;
#[macro_use] extern crate prolog_parser;
#[macro_use] extern crate ref_thread_local;

cfg_if! {
    if #[cfg(feature = "readline_rs_compat")] {
        extern crate readline_rs_compat;
    }
}

extern crate termion;

mod prolog;

use prolog::machine::*;
use prolog::machine::compile::*;
use prolog::machine::machine_errors::*;
use prolog::machine::toplevel::string_to_toplevel;
use prolog::read::*;
use prolog::write::*;

#[cfg(test)]
mod tests;

fn prolog_repl() {
    let mut wam = Machine::new();

    loop {
        #[cfg(feature = "readline_rs_compat")]
        readline::set_line_mode(readline::LineMode::Single);

        match toplevel_read_line() {
            Ok(Input::TermString(buffer)) => {
                let result = match string_to_toplevel(buffer.as_bytes(), &mut wam) {
                    Ok(packet) => compile_term(&mut wam, packet),
                    Err(e) => EvalSession::from(e)
                };

                print(&mut wam, result)
            },
            Ok(Input::Batch) => {
                #[cfg(feature = "readline_rs_compat")]
                readline::set_line_mode(readline::LineMode::Multi);

                let src = match readline::read_batch("") {
                    Ok(src) => src,
                    Err(e) => {
                        println!("{}", e);
                        continue;
                    }
                };

                let result = compile_user_module(&mut wam, &src[0 ..]);
                print(&mut wam, result);
            },
            Ok(Input::Clear) => {
                wam.clear();
                continue;
            },
            Err(e) => print(&mut wam, EvalSession::from(e))
        };

        wam.reset();
    }
}

fn main() {
    #[cfg(feature = "readline_rs_compat")]
    readline::readline_initialize();
    prolog_repl();
}