parsley/
lib.rs

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