diff --git a/demo/lambda_calculus-2.crf b/demo/lambda_calculus-2.crf new file mode 100644 index 0000000..9df50b4 --- /dev/null +++ b/demo/lambda_calculus-2.crf @@ -0,0 +1,49 @@ +data Exp where + EVar : Char -> Exp + EAbs : Char -> Exp -> Exp + EApp : Exp -> Exp -> Exp + EInt : Int -> Exp + EAdd : Exp -> Exp -> Exp + +data Val where + VInt : Int -> Val + VClosure : Cxt -> Char -> Exp -> Val + +data Cxt where + Cxt : List (Pair Char Val) -> Cxt + +lookup : Char -> Cxt -> Val +lookup x cxt = case cxt of + Cxt ps => case ps of + Cons p ps => case p of + Pair y v => case (asciiCode x) == (asciiCode y) of + True => v + False => lookup x (Cxt ps) + +insert : Char -> Val -> Cxt -> Cxt +insert x v cxt = case cxt of + Cxt ps => Cxt (Cons (Pair x v) ps) + +eval : Cxt -> Exp -> Val +eval cxt exp = case exp of + EVar x => case lookup x cxt of + VInt i => VInt i + VClosure delta x e => eval delta e + EAbs x e => VClosure cxt x e + EApp e1 e2 => case eval cxt e1 of + VClosure delta x f => + let v = VClosure cxt x e2 in + eval (insert x v delta) f + EInt i => VInt i + EAdd e1 e2 => + let i1 = case eval cxt e1 of { VInt i => i } in + let i2 = case eval cxt e2 of { VInt i => i } in + VInt (i1 + i2) + +exp = EApp (EAbs 'x' (EVar 'x')) (EApp (EAbs 'x' (EAdd (EVar 'x') (EInt 100))) (EInt 200)) +-- (λ x . x) (λ x . x + 100) 200 + +main : Int +main = case eval (Cxt Nil) exp of + VInt i => i + diff --git a/demo/lambda_calculus.ll b/demo/lambda_calculus.ll new file mode 100644 index 0000000..f5e53c4 Binary files /dev/null and b/demo/lambda_calculus.ll differ diff --git a/demo/lc b/demo/lc new file mode 100755 index 0000000..1487b91 Binary files /dev/null and b/demo/lc differ diff --git a/demo/quicksort b/demo/quicksort new file mode 100755 index 0000000..b0339d3 Binary files /dev/null and b/demo/quicksort differ diff --git a/demo/quicksort.crf b/demo/quicksort.crf new file mode 100644 index 0000000..1af02c5 --- /dev/null +++ b/demo/quicksort.crf @@ -0,0 +1,17 @@ +filter : (a -> Bool) -> List a -> List a +filter p xs = case xs of + Nil => Nil + Cons x xs => case p x of + True => Cons x (filter p xs) + False => filter p xs + +quicksort : List Int -> List Int +quicksort xs = case xs of + Nil => Nil + Cons a as => let smaller = quicksort (filter (\y. y < a) xs) in + let bigger = quicksort (filter (\y. a < y) xs) in + smaller ++ (Cons a bigger) + +-- [5, 2, 8, 9, 6, 0, 1] +main = let list = Cons 5 (Cons 2 (Cons 8 (Cons 9 (Cons 6 (Cons 0 (Cons 1 Nil)))))) in + printList (quicksort list)