1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
//! A Scheme parsing and evaluation framework. //! //! # Example //! ``` //! use parsley::run; //! //! assert_eq!( //! run("(null? '())").unwrap(), //! run("#t").unwrap() //! ); //! //! assert_eq!( //! run("(* (+ 3 4 5) (- 5 2))").unwrap(), //! run("36").unwrap() //! ); //! //! let expr = r#" //! (define (sqr x) (* x x)) //! (define (sum-of-squares x y) (+ (sqr x) (sqr y))) //! (sum-of-squares 3 4) //! "#; //! assert_eq!( //! run(expr).unwrap(), //! run("25").unwrap() //! ); //! ``` #![deny(clippy::pedantic)] #[macro_use] mod sexp; mod cont; mod ctx; mod env; mod errors; mod primitives; mod proc; mod utils; use self::cont::Cont; pub use self::ctx::Context; use self::env::{Env, Ns}; pub use self::errors::Error; pub use self::primitives::Num; use self::primitives::Primitive; pub use self::sexp::SExp; use self::proc::{Func, Proc}; pub use self::proc::utils as proc_utils; /// A shorthand Result type. pub type Result = ::std::result::Result<SExp, Error>; /// Run a code snippet in the [base context](./struct.Context.html#method.base). /// /// # Example /// ``` /// use parsley::prelude::*; /// /// assert!(run("x").is_err()); /// assert!(run("null").is_ok()); /// assert_eq!(run("null").unwrap(), SExp::Null); /// ``` pub fn run(code: &str) -> Result { Context::base().run(code) } /// Quick access to the important stuff. pub mod prelude { pub use super::{eval, run, sexp, Context, SExp}; }