-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path20130220Lecture.scm
127 lines (110 loc) · 3.14 KB
/
20130220Lecture.scm
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
122
123
124
125
126
127
;;;;;;;;;;;;;;;;;;
;;From last class
;;;;;;;;;;;;;;;;;;
; apply: takes a function and a list and applies the function to the list
; (apply + '(1 2 3)) ==> 6
(define myapply
(lambda (f l)
(cond
((null? l) '())
((null? (cdr l)) (car l))
(else (f (car l) (myapply f (cdr l)))))))
;sum: takes a list and sums the values in the list
;(define sum
; (lambda (l)
; (myapply + l)))
(define apply-f
(lambda (f)
(lambda (l)
(myapply f l))))
;We can redifine sum to be (define sum (apply-f +))
(define factoial-accum
(lambda (n total)
(if (zero? n)
total
(factorial-accum (- n 1) (* total n)))))
(define factorial-cps
(lambda (n k)
(if (zero? n)
(k 1)
(factorial-cps (- n 1) (lambda (v) (k (* v n)))))))
(define len
(lambda (l)
(if (null? l)
0
(+ l (len (cdr l))))))
;(define len-cps
; (lambda (l k)
; (if
(define member?
(lambda (a l)
(cond
((null? l) #f)
((eq? a (car l)) #t)
(else (member? a (cdr l))))))
(define member-cps?
(lambda (a l k)
(cond
((null? l) (k #f))
((eq? a (car l)) (k #t))
(else (member-cps? a (cdr l) k)))))
(define set?
(lambda (l)
(cond
((null? l) #t)
((member? (car l) (cdr l)) #f)
(else (set? (cdr l))))))
(define set-cps?
(lambda (l k)
(cond
((null? l) (k #t))
(else (member-cps? (car l) (cdr l) (lambda (v)
(if v
(k #f)
(set-cps? (cdr l) (lambda (v2) (k v2))))))))))
;;;;;;;;;;;;;;;;;;
;;From this class
;;;;;;;;;;;;;;;;;;
(define sum*
(lambda (l)
(cond
((null? l) 0)
((list? (car l)) (+ (sum* (car l)) (sum* (cdr l))))
((number? (car l)) (+ (car l) (sum* (cdr l))))
(else (sum* (cdr l))))))
(define sum-cps*
(lambda (l k)
(cond
((null? l) (k 0))
((list? (car l)) (sum-cps* (car l)
(lambda (v1) (sum-cps* (cdr l)
(lambda (v2) (k (+ v1 v2)))))))
((number? (car l)) (sum-cps* (cdr l) (lambda (v) (k (+ v (car l))))))
(else (sum-cps* (cdr l) k)))))
(define myappend-cps*
(lambda (l1 l2 k)
(if (null? (l1))
(k l2)
(myappend-cps* (cdr l1) l2 (lambda (v) (k (cons (car l1) v)))))))
(define flatten-cps
(lambda (l k)
(cond
((null? l) (k '()))
((null? (car l)) (flatten-cps (cdr l) k))
((list? (car l)) (flatten-cps (car l) (lambda (v1) (flatten-cps (cdr l) (lambda (v2) (myappend-cps v1 v2 k))))))
(else (flatten-cps (cdr l) (lambda (v) (k (cons (car l) v))))))))
(define len*
(lambda (l)
(len-cps* l (lambda (v l) (cons v l)))))
(define len-cps*
(lambda (l k)
(cond
((null? l) (k 0 '()))
((list? (car l))
(len-cps* (car l)
(lambda (v1 l1)
(len-cps* (cdr l)
(lambda (v2 l2)
(k (+ 1 v2)
(cons (cons v1 l1) l2)))))))
(else (len-cps* (cdr l) (lambda (v l) (k (+ 1 v) l)))))))