basic scaffolding

This commit is contained in:
mehbark 2026-01-01 00:42:48 -05:00
parent 8fa28c6ced
commit c5ca55124e
7 changed files with 68 additions and 1 deletions

View file

@ -1,7 +1,7 @@
# puyo 3 (this time it's nameful) # puyo 3 (this time it's nameful)
## semantics ## semantics
single-threaded, dynamically-typed (because lol), multiple named returns by default single-threaded, dynamically-typed (because lol), multiple named returns by default, pass-by-value
functions take and return a map ALWAYS functions take and return a map ALWAYS

29
src/ast.rs Normal file
View file

@ -0,0 +1,29 @@
use crate::{map::Map, symbol::Symbol, val::Val};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Ident {
/// `x`
Local(Symbol),
/// `^x`
Return(Symbol),
}
#[derive(Debug, Clone)]
pub enum Ast {
/// `x`, `^x`
Var(Ident),
/// `x = y; => y`
Set(Ident, Box<Ast>),
/// fn ([a b] [c d]) ( ... )
Fn {
inputs: Vec<Symbol>,
outputs: Vec<Symbol>,
body: Vec<Ast>,
},
/// `{x, y: z}`
Map(Map<Ast>),
/// `f x`
App(Box<Ast>, Box<Ast>),
/// `x + y` (only builtins, sorry)
BinOp(Box<Ast>, fn(Val, Val) -> Val, Box<Ast>),
}

View file

@ -1,3 +1,9 @@
mod ast;
mod map;
mod parser;
mod symbol;
mod val;
fn main() { fn main() {
println!("Hello, world!"); println!("Hello, world!");
} }

5
src/map.rs Normal file
View file

@ -0,0 +1,5 @@
use std::collections::HashMap;
use crate::symbol::Symbol;
pub type Map<V> = HashMap<Symbol, V>;

0
src/parser.rs Normal file
View file

2
src/symbol.rs Normal file
View file

@ -0,0 +1,2 @@
// TODO: intern lol
pub type Symbol = String;

25
src/val.rs Normal file
View file

@ -0,0 +1,25 @@
use std::fmt;
use crate::{map::Map, symbol::Symbol};
pub enum Val {
Number(f64),
Function {
inputs: Vec<Symbol>,
outputs: Vec<Symbol>,
run: Box<dyn FnMut(Map<Val>) -> Val>,
},
Map(Map<Val>),
}
impl fmt::Debug for Val {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Number(n) => write!(f, "{n:?}"),
Self::Function {
inputs, outputs, ..
} => write!(f, "fn([{}], [{}]", inputs.join(" "), outputs.join(" ")),
Self::Map(map) => write!(f, "{map:?}"),
}
}
}