Skip to content

Instantly share code, notes, and snippets.

@ClarkeRemy
ClarkeRemy / TaglessFinal.sml
Created January 30, 2025 03:56
Tagless Final chat discord
datatype expr = PLUS of expr * expr
| NUM of int
fun eval_expr (NUM n) = n
| eval_expr (PLUS (l,r)) = eval_expr l + eval_expr r
fun pretty_expr (NUM n) = Int.toString n
| pretty_expr (PLUS (l,r)) = "( " ^ pretty_expr l ^ " + " ^ pretty_expr r ^ " )"
@ClarkeRemy
ClarkeRemy / grokking_the _sequent_calculus.sml
Last active March 25, 2025 15:47
Grokking the Sequent Calculus
fun y f x = f (y f) x
functor Fix(type 'a f )
= struct
type 'a f = 'a f
datatype fix = FIX of fix f
fun inj v = FIX v
fun prj (FIX v) = v
end
@ClarkeRemy
ClarkeRemy / main.rs
Created November 24, 2024 16:41
Basic introduction to parsing and trees
// // if it was C :
//
// enum t {
// Plus = 0,
// Mul = 1,
// num = 2,
// }
// union e { plus : Plus<*const TG>, mul : Mul<*const TG>, num : u32 }
// struct TG { tag : int, val : e }
@ClarkeRemy
ClarkeRemy / coulomb_auxiliary.rs
Created October 16, 2024 06:42
Yet another defunctionalization exercise from a friend's code
// this is just to satisfy the type system as I don't have the function
mod boys { pub mod micb25 { pub fn boys(_:u64,_:f64)->f64 {1.0} }}
#[derive(Clone, Copy)]
pub struct Vector3<T> {x:T,y:T,z:T}
impl Vector3<f64> {
fn norm_squared(&self)->f64 {self.x*self.x+self.y*self.y+self.z*self.z}
}
// direct style
@ClarkeRemy
ClarkeRemy / formula.rs
Last active October 23, 2024 04:19
Compile Time Boolean formula Interpreter
use std::marker::PhantomData;
enum Ast{};
enum Eval{};
trait Mode {}
impl Mode for Ast {}
impl Mode for Eval {}
@ClarkeRemy
ClarkeRemy / hermite.rs
Last active October 15, 2024 15:34
Hermite expansion defunctionalization for a friend
// original
// fn hermite_expansion(i: i32, j: i32, t: i32, dist: f64, a: f64, b: f64) -> f64 {
// let p = a + b;
// let q = a * b / p;
// if t < 0 || t > i + j {
// 0.0
// } else if i == j && j == t && t == 0 {
// f64::exp(-q * dist.powi(2))
@ClarkeRemy
ClarkeRemy / dict.sml
Last active October 16, 2024 08:40
Dictionary Passing style
structure Plus = struct
datatype 'a t = T of 'a -> 'a -> 'a
end
structure Mul = struct
datatype 'a t = T of 'a -> 'a -> 'a
end
structure FromInt = struct
@ClarkeRemy
ClarkeRemy / subtratorial.sml
Last active October 28, 2024 00:25
Defunctionalization Subtractorial
(* direct style *)
fun substractorial n =
if n < 0
then 0
else n - substractorial (n-1)
(* Continuation passing style *)
(* In a functional language, when every branch is a "tail call", it optimizes to a jumps *)
(* this could already be turned into a loop pretty easily,
@ClarkeRemy
ClarkeRemy / oop.js
Created September 4, 2024 07:37
Object oriented code JS manual
const interface_method = (object, _interface)=>(method) => (
object._interface[_interface].hasOwnProperty(method)
&& (typeof object._interface[_interface][method]) == "function"
)
const implInterface = (_interface, invariant, object, impl) => {
if (!object.hasOwnProperty("_interface")) {
object._interface = {};
}
object._interface[_interface] = impl
if (!invariant(object)) {throw `FAILED TO IMPLEMENT \`${_interface}\``}
@ClarkeRemy
ClarkeRemy / recursion_schemes.rs
Last active August 30, 2024 20:52
Rust Recursion schemes
#![allow(unused)]
use std::{borrow::Borrow, convert::Infallible};
trait Functor {
type F<T>;
fn fmap<A, B>(f: impl Fn(A) -> B, x: Self::F<A>) -> Self::F<B>;
}
trait Rec: Sized {
type Fix;