Merge pull request #383 from asarhaddon/ada2tco-do
[jackhill/mal.git] / core.mal
1 (def! dec (fn* (a) (- a 1)))
2
3 (def! zero? (fn* (n) (= 0 n)))
4
5 (def! reduce
6 (fn* (f init xs)
7 (if (empty? xs)
8 init
9 (reduce f (f init (first xs)) (rest xs)))))
10
11 (def! identity (fn* (x) x))
12
13 (def! every?
14 (fn* (pred xs)
15 (if (empty? xs)
16 true
17 (if (pred (first xs))
18 (every? pred (rest xs))
19 false))))
20
21 (def! some
22 (fn* (pred xs)
23 (if (empty? xs)
24 nil
25 (let* (res (pred (first xs)))
26 (if res
27 res
28 (some pred (rest xs)))))))
29
30 (defmacro! and
31 (fn* (& xs)
32 (if (empty? xs)
33 true
34 (if (= 1 (count xs))
35 (first xs)
36 (let* (condvar (gensym))
37 `(let* (~condvar ~(first xs))
38 (if ~condvar (and ~@(rest xs)) ~condvar)))))))
39
40 (defmacro! ->
41 (fn* (x & xs)
42 (if (empty? xs)
43 x
44 (let* (form (first xs)
45 more (rest xs))
46 (if (empty? more)
47 (if (list? form)
48 `(~(first form) ~x ~@(rest form))
49 (list form x))
50 `(-> (-> ~x ~form) ~@more))))))
51
52 (defmacro! ->>
53 (fn* (x & xs)
54 (if (empty? xs)
55 x
56 (let* (form (first xs)
57 more (rest xs))
58 (if (empty? more)
59 (if (list? form)
60 `(~(first form) ~@(rest form) ~x)
61 (list form x))
62 `(->> (->> ~x ~form) ~@more))))))
63
64 ; This `nil` is intentional so that the result of doing `load-file` is
65 ; `nil` instead of whatever happens to be at the end of `core.mal`.
66 nil