feat: Add purr core

This commit is contained in:
yaeju 2026-08-30 20:05:56 +09:00
parent 62419f50f2
commit 0d100086f6
No known key found for this signature in database
2 changed files with 116 additions and 0 deletions

4
purr_core/Cargo.toml Normal file
View file

@ -0,0 +1,4 @@
[package]
name = "purr_core"
version = "0.1.0"
edition = "2024"

112
purr_core/src/lib.rs Normal file
View file

@ -0,0 +1,112 @@
use std::rc::Rc;
type StructID = usize;
type EnumID = usize;
type GenericID = usize;
type EffectID = usize;
pub type IRString = Rc<str>;
pub struct IRFunctionType {
pub params: Vec<IRType>,
pub result: Box<IRType>,
}
pub enum IRType {
Integer,
Float,
String,
Bool,
Array(Box<IRType>),
Struct(StructID),
Enum(EnumID),
Func(IRFunctionType),
Unit,
Void,
Generic(GenericID),
Effect(EffectID, Box<IRType>),
}
type StructFieldID = usize;
type EnumFieldID = usize;
pub struct IRStructField {
pub id: StructFieldID,
pub ty: IRType,
}
pub enum IREnumFieldPayload {
Unit,
Single(IRType),
Struct(Vec<IRStructField>),
}
pub struct IREnumField {
pub id: EnumFieldID,
pub payload: IREnumFieldPayload,
}
type FunctionID = usize;
pub enum IRDeclaration {
Func {
id: FunctionID,
ty: IRFunctionType,
body: IRBlock,
},
Struct {
id: StructID,
fields: Vec<IRStructField>,
},
Enum {
id: EnumID,
fields: Vec<IREnumField>,
},
}
type VariableID = usize;
pub enum IRLiteral {
Integer(isize),
Float(f32),
String(IRString),
Bool(bool),
}
pub enum IRAtom {
Literal(IRLiteral),
Variable(VariableID),
}
pub enum IRExpressionKind {
Atom(IRAtom),
Call(FunctionID, Vec<IRExpression>),
If {
condition: Box<IRAtom>,
then_branch: IRBlock,
else_branch: IRBlock,
},
}
pub struct IRExpression {
pub expr: Box<IRExpressionKind>,
pub ty: IRType,
}
pub enum IRStatement {
Define(VariableID, IRExpression),
Expression(IRExpression),
Return(IRExpression),
}
pub struct IRBlock {
pub statements: Vec<IRStatement>,
pub result: Option<IRExpression>,
}