-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathclass.rkt
89 lines (71 loc) · 1.79 KB
/
class.rkt
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#lang racket
(define-syntax cons-stream
(syntax-rules ()
((cons-stream h t)
(cons h (delay t)))))
(define (from-to a b)
(if (> a b)
'()
(cons a (from-to (+ a 1) b))))
(define (from a)
(cons-stream a (from (+ a 1))))
(define head car)
(define (tail xs)
(force (cdr xs)))
(define (first n xs)
(if (= n 0)
'()
(cons (head xs)
(first (- n 1)
(tail xs)))))
(define (repeat x)
(cons-stream x (repeat x)))
(define ones (repeat 1))
(define ones*
(cons-stream 1 ones*))
(define nats* (from 0))
(define (add-streams xs ys)
(cons-stream (+ (head xs)
(head ys))
(add-streams (tail xs)
(tail ys))))
(define nats
(cons-stream 0
(add-streams ones
nats)))
(define (fib n)
(if (<= n 1)
n
(+ (fib (- n 1)) (fib (- n 2)))))
(define (map f xs)
(if (null? xs)
'()
(cons (f (car xs))
(map f (cdr xs)))))
(define (map-stream f xs)
(cons-stream (f (head xs))
(map-stream f (tail xs))))
(define fibs* (map-stream fib nats))
(define fibs
(cons-stream 0
(cons-stream 1
(add-streams fibs
(tail fibs)))))
(define (filter-stream p? xs)
(if (p? (head xs))
(cons-stream (head xs)
(filter-stream
p?
(tail xs)))
(filter-stream p? (tail xs))))
(define (divides? d n) (= 0 (remainder n d)))
(define (sieve xs)
(cons-stream (head xs)
(sieve
(filter-stream
(lambda (y)
(not (divides?
(head xs)
y)))
xs))))
(define primes (sieve (from 2)))