-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplayground.ss
74 lines (54 loc) · 1.49 KB
/
playground.ss
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
(define (dn x)
(display x)
(newline))
(define true #t)
(define false #f)
; **********************
(define theEmptyStream '())
(define (streamRef s n)
(if (= n 0)
(streamCar s)
(streamRef (streamCdr s) (- n 1))))
(define (streamMap proc s)
(if (streamNull s)
theEmptyStream
(consStream (proc (streamCar s))
(streamMap proc (streamCdr s)))))
(define (streamForEach proc s)
(if (streamNull s)
'done
(begin (proc (streamCar s))
(streamForEach proc (streamCdr s)))))
(define (displayStream s)
(streamForEach dn s))
(define (consStream a b)
(cons a (delay b)))
(define (streamCar s) (car s))
(define (streamCdr s) (force (cdr s)))
(define (streamEnumerateInterval low high)
(if (> low high)
theEmptyStream
(consStream
low
(streamEnumerateInterval (+ low 1) high))))
(define (streamFilter pred s)
(cond ((streamNull s) theEmptyStream)
((pred (streamCar s))
(consStream (streamCar s)
(streamFilter pred
(streamCdr s))))
(else (streamFilter pred (streamCdr s)))))
(define (force delayedObject)
(delayedObject))
(define (memoProc proc)
(let ((alreadyRun false) (result false))
(lambda ()
(if (not alreadyRun)
(begin (set! result (proc))
(set! alreadyRun true)
result)
result))))
(define (delay exp)
(memoProc (lambda () exp)))
; *********************
(exit)