pub type Value = i64;
pub type ClacStack = Vec<Value>;
type FunctionIndex = usize;
#[derive(Debug, Clone)]
pub enum FunctionRef {
Resolved(FunctionIndex),
Unresolved(String),
}
#[derive(Debug, Clone)]
pub enum Token {
Literal(Value),
FunctionCall(FunctionRef),
Quit,
Print,
Drop,
Swap,
Rot,
If,
Pick,
Skip,
Colon,
Semicolon,
}
pub type Code = Vec<Token>;
#[derive(Debug)]
pub enum Function {
Clac(Code),
Native(fn(&mut ClacStack)),
ClacOp(fn(Value, Value) -> Value),
}
pub type CallStack<'a> = Vec<&'a [Token]>;
#[derive(Debug)]
pub struct FuncMap {
pub map: ahash::AHashMap<String, FunctionIndex>,
pub functions: Vec<Function>,
}
#[derive(Debug)]
pub struct ClacState {
pub stack: ClacStack,
pub funcmap: FuncMap,
}
pub enum ExecRes<'a> {
Executed,
Skip(usize),
RecursiveCall(&'a [Token]),
}
#[derive(Debug)]
#[allow(dead_code)]
pub enum ExecError {
UnknownFunction(String),
MissingArguments,
InvalidSkip,
InvalidPick,
BadFunctionDefinition,
Quit,
}