//
// code used for illustration in basics.html
//
staload "libc/SATS/math.sats" // for [sqrt]
(* ****** ****** *)
val radius = 1.0
val pi = 3.1415926
val area = pi * radius * radius
//
val square = lam (x: double): double => x * x
val area = pi * square (radius)
//
val zero_and_one = '(1, 2)
// function values
val add_double_double_1 = lam (x: double, y: double): double => x + y
val add_double_double_2 = lam (x: double) (y: double): double => x + y
// val fib = fix fib (x: Nat): Nat => if x >= 2 then fib (x-1) + fib (x-2) else x
// function declarations
// val fib = fix fib (x: Nat): Nat => if x >= 2 then fib (x-1) + fib (x-2) else x
val rec fib: Nat -> Nat = lam x => if x >= 2 then fib (x-1) + fib (x-2) else x
//
fun is_even (x: int): bool = if x > 0 then is_odd (x-1) else true
and is_odd (x: int): bool = if x > 0 then is_even (x-1) else false
// local bindings
// computing roots for [Axx + Bx + C]
fn foo (A: double, B: double, C: double): @(double, double) = let
val Delta = B * B - 4.0 * A * C
val () = if Delta < 0.0 then (prerr "no real roots!\n"; exit {void} 1)
val Delta_sqrt = sqrt (Delta)
val root1 = (~B + Delta_sqrt) / (2.0 * A)
val root2 = (~B - Delta_sqrt) / (2.0 * A)
in
@(root1, root2)
end // end of [foo]
val fact10 = fact 10 where {
fun fact (x: int): int = if x > 0 then x * fact (x-1) else 1
}
//
// postfix 80 !!
// fun !! (x: Nat): Nat = if x >= 2 then x nmul (x-2) !! else 1
//
implement main () = let
val @(r1, r2) = foo (1.0, 4.0, 4.0)
in
printf ("r1 = %f and r2 = %f\n", @(r1, r2))
end // end of [main]
(* ****** ****** *)
(* end of [basics.dats] *)