haxe, matlab, miniMAL, python, rpython: add seq/string?
[jackhill/mal.git] / ruby / core.rb
CommitLineData
8cb5cda4 1require "readline"
107d9694
IJ
2require_relative "reader"
3require_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