-
Notifications
You must be signed in to change notification settings - Fork 0
/
14.scm
129 lines (97 loc) · 2.27 KB
/
14.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
128
129
(list 1 2 3)
(define foo
(cons 1
(cons 2
(cons 3
(cons 4 '())))))
(cons 1 2)
(list (cons 'a 1) (cons 'b 2))
;; Ex 2.17
(define (last-pair lst)
(if (null? lst)
'()
(let lp ((lst lst))
(if (null? (cdr lst))
lst
(lp (cdr lst))))))
(last-pair (list 23 72 149 34))
;; Ex 2.18
(define (butlast items)
(if (null? (cdr items))
'()
(cons (car items)
(butlast (cdr items)))))
(define (reverse items)
(if (null? items)
'()
(cons (car (last-pair items))
(butlast items))))
(define (reverse items)
(define (lp items rev)
(if (null? items)
rev
(lp (cdr items)
(cons (car items) rev))))
(lp items '()))
(reverse (list 1 4 9 16 25))
;; Ex 2.19
(define no-more? null?)
(define first-denomination car)
(define except-first-denomination car)
;; Ex 2.20
(define (same-parity x . items)
(define (f parity? lst)
(if (null? lst)
'()
(if (parity? (car lst))
(cons (car lst)
(f parity? (cdr lst)))
(f parity? (cdr lst)))))
(cons x
(f (if (odd? x) odd? even?)
items)))
(same-parity 1 2 3 4 5 6 7)
(same-parity 2 3 4 5 6 7)
;; Ex 2.21
(define (square x) (* x x))
(define (square-list items)
(if (null? items)
nil
(cons (square (car items))
(square-list (cdr items)))))
(define (square-list items)
(map square items))
;; Ex 2.22
(define nil '())
(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons (square (car things))
answer))))
(iter items nil))
(square-list '(1 2 3))
;; Ex 2.23
(define (4each proc list)
(if (null? list)
'undefined-sucka
(and ; begin
(proc (car list))
(4each proc (cdr list)))))
(define (d c) (display c) c)
(for-each d '(1 2 3 #f 5))
(4each d '(1 2 3 #f 5))
(define foo (list 1 (list 2 (list 3 4))))
(cdr foo)
(cadr foo)
;; Ex 2.24
'(1 3 (5 7) 9)
(cadr (caddr '(1 3 (5 7) 9)))
'((7))
(cons (cons 7 '())
'())
(caar '((7)))
;; (define (cdadadadadar lst)
;; (cdadar (cdadar (cdar lst))))
;; (cdadadadadar '(1 (2 (3 (4 (5 (6 7)))))))