-
Notifications
You must be signed in to change notification settings - Fork 0
/
stdlib.lisp
110 lines (92 loc) · 2.83 KB
/
stdlib.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
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
(begin
(define <= (lambda (x y)
(or
(< x y)
(= x y))))
(define >= (lambda (x y)
(or
(> x y)
(= x y))))
(define abs (lambda x
(if (< x 0)
(* -1 x)
x)))
(define comparator (lambda fn
(lambda lst
(if lst
(begin
(define helper (lambda (big lst)
(if lst
(if (fn (car lst) big)
(helper (car lst) (cdr lst))
(helper big (cdr lst)))
big)))
(helper (car lst) (cdr lst)))
(quote ())))))
(define max (comparator >))
(define min (comparator <))
(define merge (lambda (l1 l2)
(if l1
(if l2
(if (< (car l1) (car l2))
(cons (car l1) (merge (cdr l1) l2))
(cons (car l2) (merge (cdr l2) l1)))
l1)
l2)))
(define every-other (lambda (lst num)
(if lst
(if (= (% num 2) 0)
(cons (car lst) (every-other (cdr lst) (+ num 1)))
(every-other (cdr lst) (+ num 1)))
(quote ()))))
(define evens (lambda lst
(every-other lst 0)))
(define odds (lambda lst
(every-other lst 1)))
(define sort (lambda lst
(if lst
(if (cdr lst)
(merge (sort (evens lst)) (sort (odds lst)))
lst)
lst)))
(define map (lambda (fn lst)
(if lst
(cons (fn (car lst)) (map fn (cdr lst)))
(quote ()))))
(define filter (lambda (fn lst)
(if lst
(if (fn (car lst))
(cons (car lst) (filter fn (cdr lst)))
(filter fn (cdr lst)))
(quote ()))))
(define reduce (lambda (fn lst val)
(if lst
(reduce fn (cdr lst) (fn val (car lst)))
val)))
(define range (lambda (a b)
(if (= a b)
(quote ())
(cons a (range (+ a 1) b)))))
(define fib (lambda (n)
(begin
(define helper (lambda (prev curr num)
(if (< num 1)
curr
(helper curr (+ prev curr) (- num 1)))))
(helper 0 1 n))))
(define fact (lambda (x)
(if (= x 0)
1
(* x (fact (- x 1))))))
(define count (lambda (item lst)
(if lst
(+ (if (= item (car lst)) 1 0) (count item (cdr lst)))
0)))
(define gcd (lambda (a b)
(if (or (< a 0) (< b 0))
((gcd (abs a) (abs b)))
(if (< a b)
(gcd b a)
(if (= b 0)
a
(gcd b (% a b))))))))