packages feed

ntha-0.1.1: examples/misc.ntha

;; recursive function

(ƒ penultimate [xs]
  (match xs
    ([] ⇒ 0)
    ([_] ⇒ 0)
    ([a _] ⇒ a)
    (_ :: t ⇒ (penultimate t))))

(fib : Z → Z)
(ƒ fib [x]
  (match x
    (0 ⇒ 0)
    (1 ⇒ 1)
    (_ ⇒ (+ (fib (- x 1)) (fib (- x 2))))))

(asserteq (fib 5) 5)
(print (int2str (fib 5)))

(ƒ fibc [x]
  (cond
    ((= x 0) ⇒ 0)
    ((= x 1) ⇒ 1)
    (else ⇒ (+ (fibc (- x 1)) (fibc (- x 2))))))

(asserteq (fibc 5) 5)
(print (int2str (fibc 5)))

(ƒ fact [n]
  (if (≤ n 1)
    1
    (* n (fact (- n 1)))))

(let f5 (fact 5))

(asserteq f5 120)
(print (int2str f5))

(ƒ fact-wrap [n]
  (let [fact (λ n → (if (≤ n 1)
                         1
                         (* n (fact (- n 1)))))]
    (fact n)))

(let f5 (fact-wrap 5))
(print (int2str f5))

(ƒ factc [n]
  (cond
    ((≤ n 1) → 1)
    (else → (* n (factc (- n 1))))))

(let fc5 (factc 5))

(asserteq fc5 120)
(print (int2str fc5))

;; record data type

(let profile {:name "ntha" :age 3})

(asserteq (:name profile) "ntha")
(print (:name profile))

;; destructuring

(let (a . b) (4 . "d"))

(let d ((4 . true) . ("test" . 'c' . a)))

(let ((_ . bool) . (_ . _ . _)) d)

(asserteq bool true)
(print (bool2str bool))

;; algebraic data type and pattern matching

(data Tree a Empty-Tree (Leaf a) (Node (Tree a) a (Tree a)))

(let t (Node (Leaf 5) 4 (Leaf 3)))

(depth : (Tree α) → Z)
(ƒ depth
  [t]
  (match t
    (Empty-Tree => 0)
    ((Leaf _) => 1)
    ((Node l _ r)  => (inc (max (depth l) (depth r))))))

(asserteq (depth t) 2)

(print (int2str (depth t)))

(asserteq (depth (Leaf 3)) 1)

(print (int2str (depth (Leaf 3))))

(asserteq (depth Empty-Tree) 0)

(print (int2str (depth Empty-Tree)))

;; lambda and high-order function

(let l [1 2])

(ƒ double [x] (* 2 x))

(let ll1 (map double l))

(asserteq ll1 [2 4])

(let ll2 (map (λ x => (* 2 x)) l))

(asserteq ll2 [2 4])

(let l2 [[1 2 3] [4 5 6]])

(asserteq (map len l2) [3 3])

;; curried function

(ƒ add [x y] (+ x y))

(let inc (add 1))

(let three (inc 2))

(asserteq three 3)

(print (int2str three))

;; lexical scope

(let a 3)

(let f (λ x → (* a x)))

(let a 5)

(asserteq (f 5) 15)

(print (int2str (f 5)))

;; monad

(let m (do Maybe
         (a <- (Just 3))
         (b <- (Just (+ a 3)))
         (return (* b 3))))

(asserteq m (Just 18))

(begin
  (let name "ntha")
  (print name)
  (print "language"))

;; negative number

(asserteq (+ -1 2) 1)

;; letrec https://github.com/zjhmale/Ntha/issues/1

(let [ev? (λ n →
            (match (λ n → (if (zero? n) false (ev? (dec n))))
              (od? → (if (zero? n) true (od? (dec n))))))
      od? (λ n →
            (match (λ n → (if (zero? n) true (od? (dec n))))
              (ev? → (if (zero? n) false (ev? (dec n))))))]
  (begin (print (bool2str (ev? 11)))
         (print (bool2str (ev? 12)))
         (print (bool2str (od? 11)))
         (print (bool2str (od? 12)))))

(id : α → α)
(ƒ id [a] a)

(asserteq (id 3) 3)
(asserteq (id true) true)

(asserteq ((λ(x: α) : α → x) 3) 3)
(asserteq ((λ(x: α) : α → x) true) true)

(let id' (λ(x: α) : α → x))
(asserteq (id' 3) 3)
(asserteq (id' true) true)

(foo : (x : Z | (> x 5)) → (z : Z | (> z 0)))
(ƒ foo [x] (- x 5))

(add : (x : Z | (≥ x 3)) → (y : Z | (≥ y 3)) → (z : Z | (≥ z 6)))
(ƒ add [x y] (+ x y))

(max : Z → Z → (z : Z | (∧ (≥ z x) (≥ z y))))
(ƒ max [x y] (if (≤ x y) y x))