-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.el
56 lines (44 loc) · 1.4 KB
/
core.el
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
(defmacro defn (name args & rest)
(let (f (cons 'fn (cons args rest)))
(list 'def name f)))
(defn not (x) (if x false true))
(defmacro when (test & rest)
(list 'if test (cons 'do rest)))
(defn empty? (coll) (= (count coll) 0))
(defn second (coll) (first (rest coll)))
(defn inc (n) (+ n 1))
(defn dec (n) (- n 1))
(defn reverse (coll)
(let (map-inner (fn (old-coll new-coll)
(if (empty? old-coll)
new-coll
(recur
(rest old-coll)
(cons (first old-coll) new-coll)))))
(map-inner coll (list))))
(defn map (f coll)
(let (map-inner (fn (old-coll new-coll)
(if (empty? old-coll)
new-coll
(recur
(rest old-coll)
(cons (f (first old-coll)) new-coll))))
mapped (map-inner (seq coll) (list)))
(reverse mapped)))
(defmacro apply (f & rest)
(cons f rest))
(defn and (& args)
(if (empty? args)
true
(if (first args)
(apply and (rest args))
false)))
(defn fib (n)
(let (fib-n (fn (x n)
(if (< (count x) n)
(recur (cons (+ (first x) (second x)) x) n)
(reverse x))))
(fib-n '(1 0) n)))
(defn describe-person (name & other-stuff)
(println "name:" name)
(println "other-stuff:" other-stuff))