Mal space cleanup. Ruby Makefile. TODO updates.
[jackhill/mal.git] / ruby / core.rb
CommitLineData
8bf53bec
JM
1$core_ns = {
2 :"=" => lambda {|a,b| a == b},
3a56f91a
JM
3 :throw => lambda {|a| raise MalException.new(a), "Mal Exception"},
4 :nil? => lambda {|a| a == nil},
5 :true? => lambda {|a| a == true},
6 :false? => lambda {|a| a == false},
7 :symbol? => lambda {|a| a.is_a? Symbol},
8 :symbol? => lambda {|a| a.is_a? Symbol},
8bf53bec
JM
9 :"pr-str" => lambda {|*a| a.map {|e| _pr_str(e, true)}.join(" ")},
10 :"str" => lambda {|*a| a.map {|e| _pr_str(e, false)}.join("")},
11 :"prn" => lambda {|*a| puts(a.map {|e| _pr_str(e, true)}.join(" "))},
12 :"println" => lambda {|*a| puts(a.map {|e| _pr_str(e, false)}.join(" "))},
13 :< => lambda {|a,b| a < b},
14 :<= => lambda {|a,b| a <= b},
15 :> => lambda {|a,b| a > b},
16 :>= => lambda {|a,b| a >= b},
17 :+ => lambda {|a,b| a + b},
18 :- => lambda {|a,b| a - b},
19 :* => lambda {|a,b| a * b},
20 :/ => lambda {|a,b| a / b},
3a56f91a 21
8bf53bec
JM
22 :list => lambda {|*a| List.new a},
23 :list? => lambda {|*a| a[0].is_a? List},
3a56f91a
JM
24 :vector => lambda {|*a| Vector.new a},
25 :vector? => lambda {|*a| a[0].is_a? Vector},
26 :"hash-map" =>lambda {|*a| Hash[a.each_slice(2).to_a]},
27 :map? => lambda {|a| a.is_a? Hash},
28 :assoc => lambda {|*a| a[0].merge(Hash[a.drop(1).each_slice(2).to_a])},
29 :dissoc => lambda {|*a| h = a[0].clone; a.drop(1).each{|k| h.delete k}; h},
30 :get => lambda {|a,b| a[b]},
31 :contains? => lambda {|a,b| a.key? b},
32 :keys => lambda {|a| List.new a.keys},
33 :vals => lambda {|a| List.new a.values},
34
35 :sequential? => lambda {|a| sequential?(a)},
d85fc037
JM
36 :cons => lambda {|a,b| List.new(b.clone.insert(0,a))},
37 :concat => lambda {|*a| List.new(a && a.reduce(:concat) || [])},
38 :nth => lambda {|a,b| a[b]},
39 :first => lambda {|a| a[0]},
40 :rest => lambda {|a| List.new(a.size > 0 && a.drop(1) || [])},
8bf53bec
JM
41 :empty? => lambda {|a| a.size == 0},
42 :count => lambda {|a| a.size},
3a56f91a
JM
43 :conj => lambda {|*a| a[0].clone.conj(a.drop(1))},
44 :apply => lambda {|*a| a[0][*a[1..-2].concat(a[-1])]},
45 :map => lambda {|a,b| List.new(b.map {|e| a[e]})},
46
47 :"with-meta" => lambda {|a,b| x = a.clone; x.meta = b; x},
48 :meta => lambda {|a| a.meta},
49 :atom => lambda {|a| Atom.new(a)},
50 :atom? => lambda {|a| a.is_a? Atom},
51 :deref => lambda {|a| a.val},
52 :reset! => lambda {|a,b| a.val = b},
53 :swap! => lambda {|*a| a[0].val = a[1][*[a[0].val].concat(a.drop(2))]},
8bf53bec
JM
54}
55