-
Notifications
You must be signed in to change notification settings - Fork 0
/
hw4 .txt
120 lines (101 loc) · 3.34 KB
/
hw4 .txt
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
#lang racket
(provide (all-defined-out)) ;; so we can put tests in a second file
;; put your code below
;-----------------------
; Problem #1
;-----------------------
(define (sequence low high stride)
(if (> low high)
null
(cons low (sequence (+ low stride) high stride))))
;-----------------------
; Problem #2
;-----------------------
(define (string-append-map xs suffix)
(map (lambda (s) (string-append s suffix)) xs))
;-----------------------
; Problem #3
;-----------------------
(define (list-nth-mod xs n)
(cond [(empty? xs) (error "list-nth-mod: empty list")]
[(< n 0) (error "list-nth-mod: negative number")]
[#t (let ([i (remainder n (length xs))])
(car (list-tail xs i)))]))
;-----------------------
; Problem #4
;-----------------------
(define (stream-for-n-steps s n)
(if (= n 0)
null
(let ([cell (s)])
(cons (car cell) (stream-for-n-steps (cdr cell) (- n 1))))))
;-----------------------
; Problem #5
;-----------------------
(define funny-number-stream
(letrec ([m (lambda (x) (if (= (remainder x 5) 0) (- x) x))]
[f (lambda (x) (cons (m x) (lambda () (f (+ x 1)))))])
(lambda () (f 1))))
;-----------------------
; Problem #6
;-----------------------
(define dan-then-dog
(letrec ([first (lambda() (cons "dan.jpg" second))]
[second (lambda() (cons "dog.jpg" first))])
first))
;-----------------------
; Problem #7
;-----------------------
(define (stream-add-zero s)
(letrec ([f (lambda (s) (let([x (s)])
(cons (cons 0 (car x)) (lambda() (f (cdr x))))))])
(lambda () (f s))))
;-----------------------
; Problem #8
;-----------------------
(define (cycle-lists xs ys)
(define (to-stream xs)
(letrec ([stream (lambda (xs n) (cons (list-nth-mod xs n) (lambda () (stream xs (+ n 1)))))])
(lambda () (stream xs 0))))
(define (combine sx sy)
(let ([x (sx)]
[y (sy)])
(cons (cons (car x) (car y)) (lambda() (combine (cdr x) (cdr y))))))
(lambda () (combine (to-stream xs) (to-stream ys))))
;-----------------------
; Problem #9
;-----------------------
(define (vector-assoc v vec)
(define (iter vec n)
(if (>= n (vector-length vec))
#f
(let([x (vector-ref vec n)])
(if (and (pair? x) (equal? (car x) v))
x
(iter vec (+ n 1))))))
(iter vec 0))
;-----------------------
; Problem #10
;-----------------------
(define (cached-assoc xs n)
(let*([cache (make-vector n #f)]
[slot 0]
[update-cache (lambda (miss)
(if (not miss) miss (begin (vector-set! cache slot miss)
(if (= (+ slot 1) n)
(set! slot 0)
(set! slot (+ slot 1))) miss)))]
[from-cache (lambda (v) (vector-assoc v cache))]
[from-list (lambda (v) (update-cache (assoc v xs)))])
(lambda (v) (let([hit (from-cache v)])
(if hit hit (from-list v))))))
;-----------------------
; Challenge Problem
;-----------------------
(define-syntax while-less
(syntax-rules (while-less do)
[(while-less e1 do e2)
(letrec ([x e1]
[y (lambda () e2)]
[iter (lambda () (if (< (y) x) (iter) #t))])
(iter))]))