blob: a1be0688538f27522731cd2353a3afeb6a7f004d (
plain)
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
130
131
132
|
(defvar nil '())
(defvar pi 3.1415926)
(defvar e 2.718281828)
(defmacro incq (i)
`(setq ,i (+ ,i 1)))
(defmacro decq (i)
`(setq ,i (- ,i 1)))
(defun zero? (x) (= x 0))
(defun plus? (x) (> x 0))
(defun minus? (x) (< x 0))
(defmacro when (pred . body)
`(if ,pred
(progn ,@body)
nil))
(defmacro unless (pred . body)
`(if ,pred
nil
(progn ,@body)))
(defun take (n lst)
(unless (integer? n)
(error "take: type error."))
(unless (list? lst)
(error "take: type error."))
(let ((i 0)
(newlst nil))
(while (and (< i n)
(not (null? lst)))
(setq newlst (cons (car lst) newlst))
(setq lst (cdr lst))
(incq i))
(nreverse newlst)))
(defun drop (n lst)
(unless (integer? n)
(error "drop type error."))
(unless (list? lst)
(error "drop: type error."))
(let ((i 0))
(while (and (< i n)
(not (null? lst)))
(setq lst (cdr lst))
(incq i))
lst))
(defun take-while (pred lst)
(unless (function? pred)
(error "take-while: type error."))
(unless (list? lst)
(error "take-while: type error."))
(let ((newlst nil))
(while (and (not (null? lst))
(funcall pred (car lst)))
(setq newlst (cons (car lst) newlst))
(setq lst (cdr lst)))
(nreverse newlst)))
(defun drop-while (pred lst)
(unless (function? pred)
(error "drop-while: type error."))
(unless (list? lst)
(error "drop-while: type error."))
(while (and (not (null? lst))
(funcall pred (car lst)))
(setq lst (cdr lst)))
lst)
(defun sublist (start end lst)
(unless (integer? start)
(error "sublist: type error."))
(unless (integer? end)
(error "sublist: type error."))
(unless (< start end)
(error "sublist: start must less than end."))
(unless (list? lst)
(error "sublist: type error."))
(drop start (take end lst)))
(defun find (x lst)
(unless (list? lst)
(error "find: type error."))
(while (not (null? lst))
(when (equal? x (car lst))
(return lst))
(setq lst (cdr lst)))
nil)
(defun contains? (x lst)
(unless (list? lst)
(error "contains?: type error."))
(while (not (null? lst))
(when (equal? x (car lst))
(return #t))
(setq lst (cdr lst)))
#f)
(defun caar (x) (car (car x)))
(defun cadr (x) (car (cdr x)))
(defun cddr (x) (cdr (cdr x)))
(defun cdar (x) (cdr (car x)))
(defun caaar (x) (car (caar x)))
(defun cadar (x) (car (cdar x)))
(defun cddar (x) (cdr (cdar x)))
(defun cdaar (x) (cdr (caar x)))
(defun caadr (x) (car (cadr x)))
(defun caddr (x) (car (cddr x)))
(defun cdddr (x) (cdr (cddr x)))
(defun cdadr (x) (cdr (cadr x)))
(defun caaaar (x) (car (caaar x)))
(defun cadaar (x) (car (cdaar x)))
(defun cddaar (x) (cdr (cdaar x)))
(defun cdaaar (x) (cdr (caaar x)))
(defun caadar (x) (car (cadar x)))
(defun caddar (x) (car (cddar x)))
(defun cdddar (x) (cdr (cddar x)))
(defun cdadar (x) (cdr (cadar x)))
(defun caaadr (x) (car (caadr x)))
(defun cadadr (x) (car (cdadr x)))
(defun cddadr (x) (cdr (cdadr x)))
(defun cdaadr (x) (cdr (caadr x)))
(defun caaddr (x) (car (caddr x)))
(defun cadddr (x) (car (cdddr x)))
(defun cddddr (x) (cdr (cdddr x)))
(defun cdaddr (x) (cdr (caddr x)))
|