-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchapter4_magic.rkt
85 lines (68 loc) · 1.33 KB
/
chapter4_magic.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
#lang r5rs
(define add1
(lambda (n)
(cons 'x n)))
(define sub1 cdr)
(define ozero? null?)
(define zero '())
(define one (add1 zero))
(define two (add1 one))
(define three (add1 two))
(define four (add1 three))
(define five (add1 four))
(define o+
(lambda (n m)
(cond
((ozero? m) n)
(else (add1 (o+ n (sub1 m)))))))
(define o-
(lambda (n m)
(cond
((ozero? m) n)
(else (sub1 (o- n (sub1 m)))))))
(define addtup
(lambda (tup)
(cond
((null? tup) zero)
(else
(o+ (car tup) (addtup (cdr tup)))))))
(define o*
(lambda (n m)
(cond
((ozero? m) zero)
(else (o+ n (o* n (sub1 m)))))))
(display (o* three two))
(newline)
(define tup+
(lambda (tup1 tup2)
(cond
((null? tup1) tup2)
((null? tup2) tup1)
(else (cons (o+ (car tup1) (car tup2)) (tup+ (cdr tup1) (cdr tup2)))))))
(define o>
(lambda (n m)
(cond
((ozero? n) #f)
((ozero? m) #t)
(else (o> (sub1 n) (sub1 m))))))
(define o<
(lambda (n m)
(o> m n)))
(define o=
(lambda (n m)
(cond
((o> n m) #f)
((o< n m) #f)
(else #t))))
(define ^
(lambda (n m)
(cond
((ozero? m) (add1 zero))
(else (o* n (^ n (sub1 m)))))))
(define o/
(lambda (n m)
(cond
((o< n m) zero)
(else (add1 (o/ (o- n m) m))))))
(display (^ four three))
(newline)