-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathprime.prog
52 lines (47 loc) · 936 Bytes
/
prime.prog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[ Generate a range of numbers ]
letrec range(start) =
proc (stop)
if
=(start,stop)
then
emptylist
else
let step =
if <(start,stop)
then
1
else
-1
in
cons(start, ((range +(start, step)) stop))
[ Higher order function filter ]
filter(p) =
proc (l)
if null?(l)
then emptylist
else if (p car(l)) then
cons(car(l), ((filter p) cdr(l)))
else ((filter p) cdr(l))
[ Modular arithmetic ]
mod(x) =
proc(y)
let q = /(x,y) in
let a = *(y, q) in
-(x, a)
[ Is n divisible by b? ]
dividesq(n) = proc(d) zero?(((mod n) d))
[ Prime loop ]
primeq(n) =
if =(n, 1)
then false
else
letrec primeloop(d) =
if <(n, *(d,d))
then true
else if ((dividesq n) d)
then false
else (primeloop +(d, 1))
in
(primeloop 2)
in
((filter primeq) ((range 1) 100))