Skip to content

Instantly share code, notes, and snippets.

View brendanzab's full-sized avatar
😵‍💫
writing elaborators

Brendan Zabarauskas brendanzab

😵‍💫
writing elaborators
View GitHub Profile
@brendanzab
brendanzab / modules.rs
Created May 15, 2024 11:01
ML-style module thing in Rust (please forgive me)
use std::hash::Hash;
pub trait Key {
type T: Hash + Eq;
}
pub trait Map<K : Key> {
type T<V>;
fn new<V>() -> Self::T<V>;
(** Fractal binary trees
L-systems are a really wonderful model of plant growth, showing how a set of
simple grammar rules can result in incredibly life-like and complicated
organic forms.
They do however seem a little… stuck in the 80s? In L-systems the state of a
plant is modelled as a list of instructions, where the branching structure
emerges from an imperative interpretation of “push” and “pop” symbols. For
example an L-system that describes a fractal binary tree looks like this:
@brendanzab
brendanzab / stlc-infer.ml
Last active November 30, 2023 10:25
A demo of translating inference rules for the STLC into a type inference algorithm
(*
T ::=
| Bool
| T -> T
t ::=
| x
| \(x : T). t
| t t
@brendanzab
brendanzab / 00-eval-int.rs
Last active October 26, 2023 11:43
Arithmetic expression evaluators and compilers in Rust.
// Syntax
pub enum Expr {
Int(i32),
Neg(Box<Expr>),
Add(Box<Expr>, Box<Expr>),
Mul(Box<Expr>, Box<Expr>),
}
// Semantics
@brendanzab
brendanzab / phrases.ml
Last active September 18, 2023 07:02
silly phrase generator thing
(** Phrase generator based on an example from the Grammatical Framework tutorial.
- {{:https://okmij.org/ftp/gengo/NASSLLI10/}
Lambda: the ultimate syntax-semantics interface}
- {{:https://www.grammaticalframework.org/doc/tutorial/gf-tutorial.html#toc16}
Grammatical Framework Tutorial: Lesson 2}
Todo:
- generate languages (orthographies, vacabularies, grammars)
@brendanzab
brendanzab / elab_stlc.ml
Last active March 2, 2023 11:10
Elaborator for a simply typed lambda calculus (based on https://gist.github.com/aradarbel10/837aa65d2f06ac6710c6fbe479909b4c)
(** An elaborator for a simply typed lambda calculus with mutable metavars.
This implementation is based on Arad Arbel’s gist:
https://gist.github.com/aradarbel10/837aa65d2f06ac6710c6fbe479909b4c
*)
module Core = struct
(** {1 Types} *)
@brendanzab
brendanzab / bidir-stlc.rs
Last active June 21, 2023 07:18
Bidirectional type checker for a simple functional language, in Rust
//! Bidirectional type checker for a simple functional language
use std::rc::Rc;
#[derive(Clone, PartialEq, Eq)]
enum Type {
Bool,
Int,
Fun(Rc<Type>, Rc<Type>),
}
@brendanzab
brendanzab / state-monads.ml
Last active October 18, 2022 11:11
Attempts at encoding state monads using mutable references in OCaml
module IndexedMonad = struct
module type S = sig
type ('i, 'a) t
val pure : 'a -> (_, 'a) t
val bind : ('i, 'a) t -> ('a -> ('i, 'b) t) -> ('i, 'b) t
end
(** {0 An implementation of a small dependently typed language}
This is an implementation simple dependently typed language where types are
first-class and where the output types of functions may depend on the inputs
supplied to them.
Type checking is is implemented in terms of an {i elaborator}, which checks
and tanslates a user-friendly {i surface language} into a simpler and more
explicit {i core language} that is more closely connected to type theory.
Because we need to simplify types during elaboration we also implement an
@brendanzab
brendanzab / record-patching.ml
Last active September 13, 2022 06:12
Elaboration with Singletons and Record patching
(** {0 Elaboration with Record Patching and Singleton Types}
This is a small implementation of a dependently typed language with
dependent record types, with some additional features intended to make it
more convenient to use records as first-class modules. It was originally
ported from {{: https://gist.github.com/mb64/04315edd1a8b1b2c2e5bd38071ff66b5}
a gist by mb64}.
The type system is implemented in terms of an ‘elaborator’, which type
checks and tanslates a user-friendly surface language into a simpler and