Commit | Line | Data |
---|---|---|
8cb5cda4 | 1 | require "readline" |
107d9694 IJ |
2 | require_relative "reader" |
3 | require_relative "printer" | |
8cb5cda4 | 4 | |
8bf53bec JM |
5 | $core_ns = { |
6 | :"=" => lambda {|a,b| a == b}, | |
3a56f91a JM |
7 | :throw => lambda {|a| raise MalException.new(a), "Mal Exception"}, |
8 | :nil? => lambda {|a| a == nil}, | |
9 | :true? => lambda {|a| a == true}, | |
10 | :false? => lambda {|a| a == false}, | |
b8ee29b2 | 11 | :symbol => lambda {|a| a.to_sym}, |
3a56f91a | 12 | :symbol? => lambda {|a| a.is_a? Symbol}, |
b8ee29b2 JM |
13 | :keyword => lambda {|a| "\u029e"+a}, |
14 | :keyword? => lambda {|a| (a.is_a? String) && "\u029e" == a[0]}, | |
8cb5cda4 | 15 | |
8bf53bec | 16 | :"pr-str" => lambda {|*a| a.map {|e| _pr_str(e, true)}.join(" ")}, |
8cb5cda4 JM |
17 | :str => lambda {|*a| a.map {|e| _pr_str(e, false)}.join("")}, |
18 | :prn => lambda {|*a| puts(a.map {|e| _pr_str(e, true)}.join(" "))}, | |
19 | :println => lambda {|*a| puts(a.map {|e| _pr_str(e, false)}.join(" "))}, | |
20 | :readline => lambda {|a| Readline.readline(a,true)}, | |
21 | :"read-string" => lambda {|a| read_str(a)}, | |
22 | :slurp => lambda {|a| File.read(a)}, | |
8bf53bec JM |
23 | :< => lambda {|a,b| a < b}, |
24 | :<= => lambda {|a,b| a <= b}, | |
25 | :> => lambda {|a,b| a > b}, | |
26 | :>= => lambda {|a,b| a >= b}, | |
27 | :+ => lambda {|a,b| a + b}, | |
28 | :- => lambda {|a,b| a - b}, | |
29 | :* => lambda {|a,b| a * b}, | |
30 | :/ => lambda {|a,b| a / b}, | |
db4c329a | 31 | :"time-ms" => lambda {|| (Time.now.to_f * 1000).to_i}, |
3a56f91a | 32 | |
8bf53bec JM |
33 | :list => lambda {|*a| List.new a}, |
34 | :list? => lambda {|*a| a[0].is_a? List}, | |
3a56f91a JM |
35 | :vector => lambda {|*a| Vector.new a}, |
36 | :vector? => lambda {|*a| a[0].is_a? Vector}, | |
37 | :"hash-map" =>lambda {|*a| Hash[a.each_slice(2).to_a]}, | |
38 | :map? => lambda {|a| a.is_a? Hash}, | |
39 | :assoc => lambda {|*a| a[0].merge(Hash[a.drop(1).each_slice(2).to_a])}, | |
40 | :dissoc => lambda {|*a| h = a[0].clone; a.drop(1).each{|k| h.delete k}; h}, | |
7e9a2883 | 41 | :get => lambda {|a,b| return nil if a == nil; a[b]}, |
3a56f91a JM |
42 | :contains? => lambda {|a,b| a.key? b}, |
43 | :keys => lambda {|a| List.new a.keys}, | |
44 | :vals => lambda {|a| List.new a.values}, | |
45 | ||
46 | :sequential? => lambda {|a| sequential?(a)}, | |
d85fc037 JM |
47 | :cons => lambda {|a,b| List.new(b.clone.insert(0,a))}, |
48 | :concat => lambda {|*a| List.new(a && a.reduce(:concat) || [])}, | |
b8ee29b2 | 49 | :nth => lambda {|a,b| raise "nth: index out of range" if b >= a.size; a[b]}, |
8d1e25ac DM |
50 | :first => lambda {|a| a.nil? ? nil : a[0]}, |
51 | :rest => lambda {|a| List.new(a.nil? || a.size == 0 ? [] : a.drop(1))}, | |
8bf53bec | 52 | :empty? => lambda {|a| a.size == 0}, |
b8ee29b2 | 53 | :count => lambda {|a| return 0 if a == nil; a.size}, |
3a56f91a JM |
54 | :conj => lambda {|*a| a[0].clone.conj(a.drop(1))}, |
55 | :apply => lambda {|*a| a[0][*a[1..-2].concat(a[-1])]}, | |
56 | :map => lambda {|a,b| List.new(b.map {|e| a[e]})}, | |
57 | ||
58 | :"with-meta" => lambda {|a,b| x = a.clone; x.meta = b; x}, | |
59 | :meta => lambda {|a| a.meta}, | |
60 | :atom => lambda {|a| Atom.new(a)}, | |
61 | :atom? => lambda {|a| a.is_a? Atom}, | |
62 | :deref => lambda {|a| a.val}, | |
63 | :reset! => lambda {|a,b| a.val = b}, | |
64 | :swap! => lambda {|*a| a[0].val = a[1][*[a[0].val].concat(a.drop(2))]}, | |
8bf53bec JM |
65 | } |
66 |