-
Notifications
You must be signed in to change notification settings - Fork 0
/
chapter_9.rkt
70 lines (63 loc) · 1.27 KB
/
chapter_9.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
(define first
(lambda (p)
(car p)))
(define second
(lambda (p)
(car (cdr p))
))
(define third
(lambda (p)
(car (cdr (cdr p)))
))
(define build
(lambda (a b)
(cons a (cons b (quote())))
))
(define a-pair?
(lambda (a)
(cond
((atom? a) #f)
((null? (cdr a)) #f)
((null? (cdr a)) #f)
(not (null? (cdr (cdr a))))
(else #f)
)))
(define looking
(lambda (a lat)
(keep-looking a (pick 1 lat) lat)))
(define keep-looking
(lambda (a i lat)
(cond
((number? i) (keep-looking a (pick i lat) lat))
(else (eq? i a))
)))
(define atom?
(lambda (a)
(not (list? a))))
(define shift
(lambda (pair)
(build (first (first pair)) (build (second (first pair)) (second pair)))
))
;(shift (list (list 1 2) (list 3 4)))
(define align
(lambda (a)
(cond
((atom? a) a)
((a-pair? (first a))
(align (shift a)))
(else (build (first a) (align (second a))))
)))
(define length*
(lambda (a)
(cond
( (atom? (car a)) 1)
(else (+ (length* (car a)) (length* (cdr a))))
)))
(define weight*
(lambda (a)
(cond
((atom? a) 1)
(else
(+ (* (weight* (first a)) 2)
(weight* (second a)))))))
(weight* (list (list 1 2) 3))