#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Noun {
Atom(u64),
Cell(Box<Noun>, Box<Noun>),
}
impl Noun {
pub fn cell(head: Noun, tail: Noun) -> Self {
Noun::Cell(Box::new(head), Box::new(tail))
}
}
pub mod tag {
pub const LIST: u64 = 0;
pub const TEXT: u64 = 1;
pub const ANNO: u64 = 2;
pub const ERROR: u64 = 3;
pub const LOG: u64 = 4;
pub const BUTTON: u64 = 5;
}
pub mod act {
pub const BASE: u64 = 0xAC75_0000_0000_0000;
pub const EMIT: u64 = BASE + 1; pub const QUERY: u64 = BASE + 2; pub const LINK: u64 = BASE + 3; pub const SEAL: u64 = BASE + 4; pub const SUBSCRIBE: u64 = BASE + 5; pub const HOST: u64 = BASE + 6;
pub const CAPS_AXIS: u64 = 30;
pub fn is_act(tag: u64) -> bool {
(BASE..=BASE + 0xFF).contains(&tag)
}
}
#[derive(Debug, Clone)]
pub enum Expr {
Atom(u64),
Text(String),
Sym(String),
Cell(Box<Expr>, Box<Expr>),
Gate { sample: Box<Expr>, body: Box<Expr> },
Let { name: String, mold: Option<Box<Expr>>, value: Box<Expr>, body: Box<Expr> },
Call { gate: Box<Expr>, args: Vec<Expr> },
If { cond: Box<Expr>, yes: Box<Expr>, no: Box<Expr> },
Match { subject: Box<Expr>, arms: Vec<(Expr, Expr)> },
Trap(Box<Expr>),
Loop,
Rebind { slot: String, value: Box<Expr>, body: Box<Expr> },
Compose(Box<Expr>, Box<Expr>),
Cast { mold: Box<Expr>, expr: Box<Expr> },
Inc(Box<Expr>),
Eq(Box<Expr>, Box<Expr>),
Add(Box<Expr>, Box<Expr>),
Sub(Box<Expr>, Box<Expr>),
Mul(Box<Expr>, Box<Expr>),
Eval { subject: Box<Expr>, formula: Box<Expr> },
Scry { mold: Box<Expr>, path: Box<Expr> },
Hint { tag: String, selector: Box<Expr>, body: Box<Expr> },
Host { target: String, args: Box<Expr> },
Arm { name: String, body: Box<Expr> },
Door(Vec<Expr>),
MethodCall { obj: String, method: String, args: Vec<Expr> },
Address(Address),
}
#[derive(Debug, Clone)]
pub enum Address {
Particle(String),
Neuron(String),
Name(String),
Path(Vec<String>),
Token(String),
Abstract(String),
Home,
}