From 4002b8988c799a904ef1f359d4267ef4ad80cba3 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 5 Dec 2022 14:19:12 +0200 Subject: Rename project to Milch --- stdlib/common.milch | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 stdlib/common.milch (limited to 'stdlib/common.milch') diff --git a/stdlib/common.milch b/stdlib/common.milch new file mode 100644 index 0000000..4d5b132 --- /dev/null +++ b/stdlib/common.milch @@ -0,0 +1,69 @@ +(let! compose (\[f g] + (\[x] (f (g x))))) + +(let! id (\[a] a)) + +(let! mod (\[n k] + (- n (* k (/ n k))))) + +(let! not (\[b] + (match b + true false + false true))) + +(let! is-even (\[n] + (match (mod n 2) + 0 true + 1 false))) + +(let! is-odd (compose not is-even)) + +;; map :: (a -> b) -> [a] -> [b] +(let! map (\[f lst] + (match lst + [] + [] + otherwise + (prepend (f (head lst)) (map f (tail lst)))))) + +; (map (+ 1) [1 2 3]) + +;; foldr :: (a -> b -> b) -> b -> [a] -> b +(let! foldr (\[f accumulator lst] + (match lst + [] + accumulator + otherwise + (f (head lst) (foldr f accumulator (tail lst)))))) + +;; filter :: (a -> Bool) -> [a] -> [a] +(let! filter (\[pred lst] + (match lst + [] [] + otherwise (match (pred (head lst)) + true + (prepend (head lst) (filter pred (tail lst))) + false + (filter pred (tail lst)))))) + +(let! fibo (\[n] + (let! lazy fibo-1 (fibo (- n 1))) + (let! lazy fibo-2 (fibo (- n 2))) + (match n + 0 0 + 1 1 + _ (+ fibo-1 fibo-2)))) + +(let! reverse_ (\[v a] + (let! lazy x (head v)) + (let! lazy xs (tail v)) + (let! lazy xa (prepend x a)) + (match v + [] a + _ (reverse_ xs xa)))) + +(let! reverse (\[v] + (reverse_ v []))) + +(let! flow (\[fs] (foldr compose id (reverse fs)))) +(let! pipe (\[x fs] ((flow fs) x))) -- cgit v1.3