pec-0.2.3: test_cases/euler/Euler10.pec
module Euler10
// The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
// Find the sum of all the primes below two million.
imports
Prelude
Data.Stack
where
main :: () -> I32
main () = do
p = new (stack #200000)
assert (primes 2000000 p)
// put putW p
t = sum p
// BAL: printing of W64 is broken putW t
assert (t == 142913828922)
0
sum :: Ptr (Stack #cnt W32) -> W64
sum => fold my_add 0
my_add :: W64 -> W32 -> W64
my_add x y => x + unsafe_cast y // BAL: casting from W32 to W64 isn't unsafe
primes :: W32 -> Ptr (Stack #cnt W32) -> Bool
primes w p => do
empty p
b = new (push 2 p)
for 3 (\i -> @b && (i < w)) (add 2)
(\i -> when (not (any (is_factor i) p)) (b <- push i p))
@b
is_factor :: { Arith a, Eq a } => a -> a -> Bool
is_factor x y => (x % y) == 0