Merge pull request #238 from prt2121/pt/haskell-7.10.1
[jackhill/mal.git] / ruby / types.rb
1 require_relative "env"
2
3 class MalException < StandardError
4 attr_reader :data
5 def initialize(data)
6 @data = data
7 end
8 end
9
10 class String # re-open and add seq
11 def seq()
12 return List.new self.split("")
13 end
14 end
15
16 class List < Array
17 attr_accessor :meta
18 def conj(xs)
19 xs.each{|x| self.unshift(x)}
20 return self
21 end
22 def seq()
23 return self
24 end
25 end
26
27 class Vector < Array
28 attr_accessor :meta
29 def conj(xs)
30 self.push(*xs)
31 return self
32 end
33 def seq()
34 return List.new self
35 end
36 end
37
38 class Hash # re-open and add meta
39 attr_accessor :meta
40 end
41
42 def sequential?(obj)
43 return obj.is_a?(List) || obj.is_a?(Vector)
44 end
45
46 class Proc # re-open and add meta
47 attr_accessor :meta
48 end
49
50 class Function < Proc
51 attr_accessor :ast
52 attr_accessor :env
53 attr_accessor :params
54 attr_accessor :is_macro
55
56 def initialize(ast=nil, env=nil, params=nil, &block)
57 super()
58 @ast = ast
59 @env = env
60 @params = params
61 @is_macro = false
62 end
63
64 def gen_env(args)
65 return Env.new(@env, @params, args)
66 end
67 end
68
69 class Atom
70 attr_accessor :meta
71 attr_accessor :val
72 def initialize(val)
73 @val = val
74 end
75 end