-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathch3.lisp
82 lines (71 loc) · 1.92 KB
/
ch3.lisp
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
; Excersises from Chapter 3 of "ANSI Common Lisp".
; 5.
(defun rec-pos+ (lst)
(reverse (do-rec-pos+ 0 '() (first lst) (rest lst))))
(defun do-rec-pos+ (pos result elm tail)
(if (null elm)
result
(do-rec-pos+ (+ pos 1) (cons (+ pos elm) result) (first tail) (rest tail))))
(defun iter-pos+ (lst)
(let ((pos 0)
(result '()))
(dolist (elm lst)
(setf result (cons (+ pos elm) result))
(setf pos (+ pos 1)))
(reverse result)))
(defun mapcar-pos+ (lst)
(let ((pos 0))
(mapcar #'(lambda (x)
(let ((ret (+ pos x)))
(setf pos (+ pos 1))
ret))
lst)))
;
; Sequence generator => (0, 1, 2, ...)
;
; (setf cnt (counter))
; (funcall cnt) => 0
; (funcall cnt) => 1
; ...
;
(defun counter ()
(let ((pos 0))
(lambda ()
(let ((curr pos))
(setf pos (+ pos 1))
curr))))
; 3.
(defun occurences (lst)
(sort (count-occurences '() (first lst) (rest lst))
#'> :key #'rest))
; #'(lambda (x y) (> (rest x) (rest y)))))
(defun count-occurences (pairs elm lst)
(if (null elm)
pairs
(count-occurences
(update-pairs pairs elm lst)
(first lst)
(rest lst))))
(defun update-pairs (pairs elm lst)
(if (assoc elm pairs)
pairs
(let ((n 1))
(dolist (elm2 lst)
(and (eql elm elm2)
(setf n (+ n 1))))
(cons (cons elm n) pairs))))
; 2.
(defun new-union (lst1 lst2)
(reverse (add-one-of-each '() (first lst1) (first lst2) (rest lst1) (rest lst2))))
(defun add-one-of-each (result elm1 elm2 tail1 tail2)
(if (and (null elm1) (null elm2))
result
(add-one-of-each
(let* ((res1 (if (not (null elm1))
(adjoin elm1 result)
result))
(res2 (if (not (null elm2))
(adjoin elm2 res1)
res1)))
res2)
(first tail1) (first tail2) (rest tail1) (rest tail2))))