#![doc = include_str!("readme.md")]
use core::range::Range;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SchemeRoot {
pub expressions: Vec<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expression {
List(Vec<Expression>),
Identifier(String),
NumberLiteral(String),
StringLiteral(String),
CharacterLiteral(char),
BooleanLiteral(bool),
Symbol(String),
Keyword(String),
Quotation(Box<Expression>),
Define(Define),
Lambda(Lambda),
If(If),
Cond(Vec<CondClause>),
Case(Case),
Let(Let),
LetStar(Let),
Letrec(Let),
Begin(Vec<Expression>),
Do(Do),
Set(Set),
And(Vec<Expression>),
Or(Vec<Expression>),
Not(Box<Expression>),
Error(String),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Define {
pub name: String,
pub parameters: Vec<String>,
pub body: Vec<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Lambda {
pub parameters: Vec<String>,
pub body: Vec<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct If {
pub condition: Box<Expression>,
pub then_branch: Box<Expression>,
pub else_branch: Option<Box<Expression>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CondClause {
pub condition: Expression,
pub body: Vec<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Case {
pub expression: Box<Expression>,
pub cases: Vec<(Vec<Expression>, Vec<Expression>)>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Let {
pub bindings: Vec<(String, Expression)>,
pub body: Vec<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Do {
pub bindings: Vec<(String, Expression, Expression)>,
pub conditions: Vec<(Expression, Vec<Expression>)>,
pub body: Vec<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Set {
pub name: String,
pub value: Box<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}