Expand description
An S-Expression. Can be parsed from a string via FromStr, or constructed programmatically.
Examples
use parsley::{NULL, SExp};
let null = "()".parse::<SExp>().unwrap();
assert_eq!(null, NULL);
use parsley::{NULL, SExp};
let null = SExp::List(Vec::new());
assert_eq!(null, NULL);
Variants§
Implementations§
source§impl SExp
impl SExp
sourcepub fn eval(self, ctx: &mut Context) -> LispResult
pub fn eval(self, ctx: &mut Context) -> LispResult
Evaluate an S-Expression in a context.
The context will retain any definitions bound during evaluation
(e.g. define
, set!
).
Examples
use parsley::{AsAtom, Context};
use parsley::SExp::{self, List};
let exp = List(vec![SExp::make_symbol("eq?"), 0.0.as_atom(), 1.0.as_atom()]);
let mut ctx = Context::base();
let result = exp.eval(&mut ctx);
assert_eq!(result.unwrap(), false.as_atom());
use parsley::{AsAtom, Context};
use parsley::SExp::{self, List};
let exp1 = List(vec![
SExp::make_symbol("define"),
SExp::make_symbol("x"),
10.0.as_atom()
]);
let exp2 = SExp::make_symbol("x");
let mut ctx = Context::base();
exp1.eval(&mut ctx);
let result = exp2.eval(&mut ctx);
assert_eq!(result.unwrap(), 10.0.as_atom());
sourcepub fn make_symbol(sym: &str) -> Self
pub fn make_symbol(sym: &str) -> Self
Convenience method to build a symbolic atom.
Example
use parsley::{Context, NULL, SExp};
let mut ctx = Context::base();
// A null list is an empty application
assert!(NULL.eval(&mut ctx).is_err());
// The symbol `null` (defined in `Context::base`) creates a null list
let result = SExp::make_symbol("null").eval(&mut ctx);
assert!(result.is_ok());
assert_eq!(result.unwrap(), NULL);