Primes

As a reactive program, this is quite degenerate: when started, it expects a positive integer n>2 as command line argument. It computes all primes smaller than or equal to n, prints the number of such primes to stdout and terminates.

The algorithm used illustrates imperative programming using updatable arrays in Timber. Here is the program:


module Primes where

import POSIX 

root = newRoot primes

primes env = class
   limit :: Int
   limit = fromRight (parse (env.argv!1))
   primesBound = limit `div` log3 limit

   primes := uniarray primesBound 0
   count  := 0

   isPrime k = loop 0
      where loop n = do 
              p = primes!n
              if p*p > k then
                 result True
              elsif k `mod` p  == 0 then
                 result False
              else loop (n+1)

   checkFrom k = do
     p <- isPrime k
     if p then 
        primes!count := k
        count := count + 1
     if k < limit then checkFrom (k+1)

   result action
     primes!0 := 2
     count := 1
     checkFrom 3
     env.stdout.write (show count++"\n")
     env.exit 0

log3 n  
  | n < 3       = 0
  | otherwise   = 1 + log3 (n `div` 3)
  

We note also that the correctness of the program depends on two mathematical facts: