aboutsummaryrefslogtreecommitdiffhomepage
path: root/libslang/examples/prime.sl
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2011-10-14 04:55:05 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2011-10-14 04:55:05 +0200
commit6aa0e0017d7d0cddc006da885946934b06949a91 (patch)
tree66b688ec32e2f91266db760b1762f2a50cc52036 /libslang/examples/prime.sl
parenta966db5b71328f6adf9dd767e64b322a3bd7ed9c (diff)
downloaderlang-slang-fork-6aa0e0017d7d0cddc006da885946934b06949a91.tar.gz
include libslang-1.4.9 and automatically build it and link erlang-slang against it
few (erlang) people will still have libslang-1.4.9 installed or spend time to get it to link against the driver
Diffstat (limited to 'libslang/examples/prime.sl')
-rw-r--r--libslang/examples/prime.sl46
1 files changed, 46 insertions, 0 deletions
diff --git a/libslang/examples/prime.sl b/libslang/examples/prime.sl
new file mode 100644
index 0000000..154f2ee
--- /dev/null
+++ b/libslang/examples/prime.sl
@@ -0,0 +1,46 @@
+#! /usr/bin/env slsh
+% This demo counts the number of primes between 2 and some integer
+
+static define usage ()
+{
+ () = fprintf (stderr, "Usage: %S <integer greater than 2>\n", __argv[0]);
+ exit (1);
+}
+
+define count_primes (num)
+{
+ variable size = (num - 1)/2;
+ variable nonprimes = Char_Type[size + 1]; % last one is sentinel
+ variable count = 1;
+ variable prime = 3;
+ variable i = 0;
+
+ do
+ {
+ count++;
+ %()=printf ("%S\n", prime);
+
+ nonprimes [[i:size-1:prime]] = 1;
+ variable i_save = i;
+ while (i++, nonprimes[i])
+ ;
+ prime += 2 * (i - i_save);
+ }
+ while (i < size);
+
+ return count;
+}
+
+
+static variable Num;
+
+if (__argc != 2)
+ usage ();
+Num = integer (__argv[1]);
+if (Num < 3)
+ usage ();
+
+tic ();
+()=printf ("\n\n%d primes between 2 and %d in %f seconds.\n",
+ count_primes (Num), Num, toc ());
+exit(0);