/
data.sc
121 lines (94 loc) · 3.59 KB
/
data.sc
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
;;library for data structures
(library (core data)
(export (rename [internal-queue queue]) queue? queue-push queue-pop! queue-push!
queue-map
(rename [internal-stream stream]
[stream-null!? stream-null?]
[internal-stream? stream?])
stream-null
stream-car
stream-cdr
stream-take
stream-ref
stream-map
integers-from
naturals
stream-cons
stream*
stream-drop
)
(import (chezscheme))
;;;Queues
(define-record queue (head tail))
(define (internal-queue . args)
(make-queue '() args))
(define (queue-push q val)
(define h (queue-head q))
(define t (queue-tail q))
(make-queue (cons val h) t))
(define (queue-push! q val)
(set-queue-head! q (cons val (queue-head q))))
(define (queue-pop! q)
(define h (queue-head q))
(define t (queue-tail q))
(cond [(and (null? t) (null? h)) (error 'queue-pop! "Nothing to pop.")]
[(null? t) (set-queue-head! q '())
(let ([nt (reverse h)])
(set-queue-tail! q (cdr nt))
(car nt))]
[else (set-queue-tail! q (cdr t))
(car t)]))
(define (queue-empty? q)
(and (null? (queue-head q)) (null? (queue-tail q))))
(define (queue-map f q)
(make-queue (map f (queue-head q))
(map f (queue-tail q))))
;;;
;;;Streams
(define-record stream (value rest))
(define-record stream-null! ())
(define stream-null (make-stream-null!))
(define-syntax internal-stream
(syntax-rules ()
((_) stream-null)
((_ arg . rest) (make-stream arg
(delay (internal-stream . rest))))))
(define-syntax stream-cons
(syntax-rules ()
((_ a b) (make-stream a
(delay b)))))
(define stream-car stream-value)
(define (stream-cdr s)
(force (stream-rest s))
)
(define (internal-stream? s)
(or (stream? s) (stream-null!? s)))
(define (stream-take s n)
(if (or (= n 0) (stream-null!? s))
'()
(cons (stream-car s) (stream-take (stream-cdr s) (- n 1)))))
(define (integers-from n)
(stream-cons n
(integers-from (+ n 1))))
(define naturals (integers-from 0))
(define (stream-ref s n)
(if (= n 0)
(stream-car s)
(stream-ref (stream-cdr s) (- n 1))))
(define (stream-map f . streams)
(if (andmap stream-null!? streams)
stream-null
(stream-cons (apply f (map stream-car streams))
(apply stream-map
(cons f (map stream-cdr streams))))))
(define-syntax stream*
(syntax-rules ()
((_ a) a)
((_ a b c ...) (stream-cons a
(stream* b c ...)))))
(define (stream-drop s n)
(if (= n 0)
s
(stream-drop (stream-cdr s) (- n 1))))
)
(import (core data))