hvm 1.0.15-beta

A massively parallel functional runtime.
Documentation
// The Scott-Encoded Bits type
(End)  = λe λo λi e
(B0 p) = λe λo λi (o p)
(B1 p) = λe λo λi (i p)

// Applies `f` `xs` times to `x`
(App xs f x) =
  let e = λf λx x
  let o = λpλfλx(App p λk(f (f k)) x)
  let i = λpλfλx(App p λk(f (f k)) (f x))
  (xs e o i f x)

// Increments a Bits by 1
(Inc xs) = λex λox λix
  let e = ex
  let o = ix
  let i = λp (ox (Inc p))
  (xs e o i)

// Adds two Bits
(Add xs ys) = (App xs λx(Inc x) ys)

// Multiplies two Bits
(Mul xs ys) =
  let e = End
  let o = λp (B0 (Mul p ys))
  let i = λp (Add ys (B0 (Mul p ys)))
  (xs e o i)

// Converts a Bits to an U32
(ToU32 ys) =
  let e = 0
  let o = λp (+ 0 (* 2 (ToU32 p)))
  let i = λp (+ 1 (* 2 (ToU32 p)))
  (ys e o i)

// Converts an U32 to a Bits
(FromU32 0 i) = End
(FromU32 s i) = (FromU32Put (- s 1) (% i 2) (/ i 2))
  (FromU32Put s 0 i) = (B0 (FromU32 s i))
  (FromU32Put s 1 i) = (B1 (FromU32 s i))

// Squares (n * 100k)
(Main n) =
  let a = (FromU32 32 (* 100000 n))
  let b = (FromU32 32 (* 100000 n))
  (ToU32 (Mul a b))