atomy 0.1.1 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +13 -0
  3. data/LICENSE.md +201 -0
  4. data/bin/atomy +16 -133
  5. data/kernel/array.ay +6 -0
  6. data/kernel/atomy.ay +18 -0
  7. data/kernel/condition.ay +171 -271
  8. data/kernel/control-flow.ay +197 -192
  9. data/kernel/core.ay +120 -0
  10. data/kernel/data.ay +83 -39
  11. data/kernel/define.ay +84 -93
  12. data/kernel/doc.ay +282 -449
  13. data/kernel/dynamic.ay +25 -29
  14. data/kernel/file.ay +9 -0
  15. data/kernel/grammar.ay +267 -0
  16. data/kernel/hash.ay +17 -0
  17. data/kernel/interpolation.ay +59 -0
  18. data/kernel/io.ay +70 -244
  19. data/kernel/let-macro.ay +24 -0
  20. data/kernel/let-pattern.ay +24 -0
  21. data/kernel/loop.ay +80 -0
  22. data/kernel/mutation.ay +53 -0
  23. data/kernel/particles.ay +176 -39
  24. data/kernel/patterns.ay +527 -191
  25. data/kernel/pretty.ay +311 -277
  26. data/kernel/quotes.ay +29 -0
  27. data/kernel/range.ay +4 -0
  28. data/kernel/regexp.ay +23 -0
  29. data/kernel/repl.ay +83 -109
  30. data/kernel/stack-local.ay +21 -0
  31. data/lib/atomy.rb +37 -0
  32. data/lib/atomy/bootstrap.rb +256 -0
  33. data/lib/atomy/code/assign.rb +64 -0
  34. data/lib/atomy/code/block.rb +98 -0
  35. data/lib/atomy/code/class_variable.rb +17 -0
  36. data/lib/atomy/code/constant.rb +21 -0
  37. data/lib/atomy/code/define.rb +242 -0
  38. data/lib/atomy/code/define_function.rb +51 -0
  39. data/lib/atomy/code/define_method.rb +20 -0
  40. data/lib/atomy/code/false.rb +9 -0
  41. data/lib/atomy/code/instance_variable.rb +15 -0
  42. data/lib/atomy/code/integer.rb +13 -0
  43. data/lib/atomy/code/list.rb +17 -0
  44. data/lib/atomy/code/nil.rb +9 -0
  45. data/lib/atomy/code/pattern.rb +23 -0
  46. data/lib/atomy/code/pattern/and.rb +61 -0
  47. data/lib/atomy/code/pattern/quasi_quote.rb +185 -0
  48. data/lib/atomy/code/pattern/splat.rb +29 -0
  49. data/lib/atomy/code/pattern/wildcard.rb +37 -0
  50. data/lib/atomy/code/quasi_quote.rb +118 -0
  51. data/lib/atomy/code/quote.rb +13 -0
  52. data/lib/atomy/code/self.rb +9 -0
  53. data/lib/atomy/code/send.rb +110 -0
  54. data/lib/atomy/code/sequence.rb +23 -0
  55. data/lib/atomy/code/string_literal.rb +53 -0
  56. data/lib/atomy/code/symbol.rb +13 -0
  57. data/lib/atomy/code/true.rb +9 -0
  58. data/lib/atomy/code/undefined.rb +9 -0
  59. data/lib/atomy/code/variable.rb +17 -0
  60. data/lib/atomy/codeloader.rb +218 -0
  61. data/lib/atomy/compiler.rb +57 -0
  62. data/lib/atomy/errors.rb +54 -0
  63. data/lib/atomy/grammar.rb +2278 -0
  64. data/lib/atomy/locals.rb +75 -0
  65. data/lib/atomy/message_structure.rb +277 -0
  66. data/lib/atomy/method.rb +343 -0
  67. data/lib/atomy/module.rb +144 -0
  68. data/lib/atomy/node/constructable.rb +169 -0
  69. data/lib/atomy/node/equality.rb +113 -0
  70. data/lib/atomy/node/meta.rb +206 -0
  71. data/lib/atomy/node/pretty.rb +108 -0
  72. data/lib/atomy/parser.rb +21 -0
  73. data/lib/atomy/pattern.rb +26 -0
  74. data/lib/atomy/pattern/and.rb +59 -0
  75. data/lib/atomy/pattern/attribute.rb +16 -0
  76. data/lib/atomy/pattern/class_variable.rb +15 -0
  77. data/lib/atomy/pattern/equality.rb +42 -0
  78. data/lib/atomy/pattern/instance_variable.rb +15 -0
  79. data/lib/atomy/pattern/kind_of.rb +20 -0
  80. data/lib/atomy/pattern/or.rb +48 -0
  81. data/lib/atomy/pattern/quasi_quote.rb +164 -0
  82. data/lib/atomy/pattern/splat.rb +15 -0
  83. data/lib/atomy/pattern/wildcard.rb +18 -0
  84. data/lib/atomy/rubygems.rb +48 -0
  85. data/lib/atomy/version.rb +3 -0
  86. metadata +169 -134
  87. data/COPYING +0 -30
  88. data/README.md +0 -1
  89. data/kernel/block.ay +0 -30
  90. data/kernel/boot.ay +0 -10
  91. data/kernel/comparison.ay +0 -61
  92. data/kernel/concurrency.ay +0 -84
  93. data/kernel/cosmetics.ay +0 -3
  94. data/kernel/data-delta.ay +0 -105
  95. data/kernel/documentation.ay +0 -135
  96. data/kernel/errors.ay +0 -6
  97. data/kernel/format.ay +0 -13
  98. data/kernel/format/data.ay +0 -89
  99. data/kernel/format/formatter.ay +0 -345
  100. data/kernel/format/parser.ay +0 -13
  101. data/kernel/hashes.ay +0 -39
  102. data/kernel/namespaces.ay +0 -63
  103. data/kernel/node.ay +0 -48
  104. data/kernel/operators.ay +0 -28
  105. data/kernel/precision.ay +0 -148
  106. data/kernel/therie.ay +0 -204
  107. data/lib/ast/binary_send.rb +0 -44
  108. data/lib/ast/block.rb +0 -268
  109. data/lib/ast/constant.rb +0 -88
  110. data/lib/ast/internal/assign.rb +0 -19
  111. data/lib/ast/internal/block_pass.rb +0 -21
  112. data/lib/ast/internal/catch.rb +0 -247
  113. data/lib/ast/internal/class.rb +0 -30
  114. data/lib/ast/internal/class_variable.rb +0 -23
  115. data/lib/ast/internal/define.rb +0 -174
  116. data/lib/ast/internal/ensure.rb +0 -135
  117. data/lib/ast/internal/file.rb +0 -14
  118. data/lib/ast/internal/global_variable.rb +0 -20
  119. data/lib/ast/internal/if_then_else.rb +0 -24
  120. data/lib/ast/internal/instance_variable.rb +0 -17
  121. data/lib/ast/internal/let_macro.rb +0 -35
  122. data/lib/ast/internal/macro_quote.rb +0 -23
  123. data/lib/ast/internal/match.rb +0 -53
  124. data/lib/ast/internal/module.rb +0 -30
  125. data/lib/ast/internal/pattern.rb +0 -17
  126. data/lib/ast/internal/return.rb +0 -29
  127. data/lib/ast/internal/set.rb +0 -19
  128. data/lib/ast/internal/singleton_class.rb +0 -18
  129. data/lib/ast/internal/splat.rb +0 -14
  130. data/lib/ast/internal/when.rb +0 -24
  131. data/lib/ast/list.rb +0 -25
  132. data/lib/ast/macro.rb +0 -37
  133. data/lib/ast/node.rb +0 -599
  134. data/lib/ast/operator.rb +0 -21
  135. data/lib/ast/particle.rb +0 -13
  136. data/lib/ast/primitive.rb +0 -20
  137. data/lib/ast/quasi_quote.rb +0 -20
  138. data/lib/ast/quote.rb +0 -13
  139. data/lib/ast/send.rb +0 -104
  140. data/lib/ast/splice.rb +0 -32
  141. data/lib/ast/string.rb +0 -23
  142. data/lib/ast/unary.rb +0 -44
  143. data/lib/ast/unquote.rb +0 -45
  144. data/lib/ast/variable.rb +0 -64
  145. data/lib/atomy.kpeg.rb +0 -3995
  146. data/lib/code_loader.rb +0 -137
  147. data/lib/compiler/compiler.rb +0 -155
  148. data/lib/compiler/stages.rb +0 -81
  149. data/lib/formatter.kpeg.rb +0 -1394
  150. data/lib/macros.rb +0 -317
  151. data/lib/method.rb +0 -261
  152. data/lib/namespace.rb +0 -236
  153. data/lib/parser.rb +0 -28
  154. data/lib/patterns.rb +0 -276
  155. data/lib/patterns/any.rb +0 -21
  156. data/lib/patterns/attribute.rb +0 -59
  157. data/lib/patterns/block_pass.rb +0 -54
  158. data/lib/patterns/constant.rb +0 -33
  159. data/lib/patterns/default.rb +0 -44
  160. data/lib/patterns/head_tail.rb +0 -63
  161. data/lib/patterns/list.rb +0 -77
  162. data/lib/patterns/match.rb +0 -45
  163. data/lib/patterns/named.rb +0 -55
  164. data/lib/patterns/named_class.rb +0 -46
  165. data/lib/patterns/named_global.rb +0 -46
  166. data/lib/patterns/named_instance.rb +0 -46
  167. data/lib/patterns/particle.rb +0 -29
  168. data/lib/patterns/quasi_quote.rb +0 -184
  169. data/lib/patterns/quote.rb +0 -33
  170. data/lib/patterns/singleton_class.rb +0 -31
  171. data/lib/patterns/splat.rb +0 -57
  172. data/lib/util.rb +0 -37
@@ -0,0 +1,20 @@
1
+ require "atomy/compiler"
2
+ require "atomy/code/define"
3
+
4
+ module Atomy
5
+ module Code
6
+ class DefineMethod < Define
7
+ def bytecode(gen, mod)
8
+ gen.push_cpath_top
9
+ gen.find_const(:Atomy)
10
+ gen.push_cpath_top
11
+ gen.find_const(:Kernel)
12
+ gen.send(:binding, 0)
13
+ gen.push_literal(@name)
14
+ push_branch(gen, mod)
15
+ gen.send(:for_method!, 0)
16
+ gen.send(:define_branch, 3)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module Atomy
2
+ module Code
3
+ class False
4
+ def bytecode(gen, mod)
5
+ gen.push_false
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module Atomy
2
+ module Code
3
+ class InstanceVariable
4
+ attr_reader :name
5
+
6
+ def initialize(name)
7
+ @name = name
8
+ end
9
+
10
+ def bytecode(gen, mod)
11
+ gen.push_ivar(:"@#{@name}")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Atomy
2
+ module Code
3
+ class Integer
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+
8
+ def bytecode(gen, mod)
9
+ gen.push_int(@value)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module Atomy
2
+ module Code
3
+ class List
4
+ def initialize(elements)
5
+ @elements = elements
6
+ end
7
+
8
+ def bytecode(gen, mod)
9
+ @elements.each do |e|
10
+ mod.compile(gen, e)
11
+ end
12
+
13
+ gen.make_array(@elements.size)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module Atomy
2
+ module Code
3
+ class Nil
4
+ def bytecode(gen, mod)
5
+ gen.push_nil
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ module Atomy
2
+ module Code
3
+ class Pattern
4
+ attr_reader :node
5
+
6
+ def initialize(node)
7
+ @node = node
8
+ end
9
+
10
+ def bytecode(gen, mod)
11
+ mod.compile(gen, @node)
12
+ end
13
+
14
+ # [value, pattern] on stack
15
+ def assign(gen)
16
+ end
17
+
18
+ def splat?
19
+ false
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,61 @@
1
+ require "atomy/code/pattern"
2
+
3
+ require "atomy/node/meta"
4
+
5
+
6
+ class Atomy::Code::Pattern
7
+ class And < self
8
+ def initialize(a, b)
9
+ @a = a
10
+ @b = b
11
+ end
12
+
13
+ def bytecode(gen, mod)
14
+ gen.push_cpath_top
15
+ gen.find_const(:Atomy)
16
+ gen.find_const(:Pattern)
17
+ gen.find_const(:And)
18
+ mod.compile(gen, @a)
19
+ mod.compile(gen, @b)
20
+ gen.send(:new, 2)
21
+ end
22
+
23
+ def assign(gen)
24
+ # [value, pattern, value, pattern]
25
+ gen.dup_many(2)
26
+
27
+ # [pattern, value, value, pattern]
28
+ gen.swap
29
+
30
+ # [a pattern, value, value, pattern]
31
+ gen.send(:a, 0)
32
+
33
+ # [value, a pattern, value, pattern]
34
+ gen.swap
35
+
36
+ # [value, a pattern, value, pattern]
37
+ @a.assign(gen)
38
+
39
+ # [value, pattern]
40
+ gen.pop_many(2)
41
+
42
+ # [value, pattern, value, pattern]
43
+ gen.dup_many(2)
44
+
45
+ # [pattern, value, value, pattern]
46
+ gen.swap
47
+
48
+ # [b pattern, value, value, pattern]
49
+ gen.send(:b, 0)
50
+
51
+ # [value, b pattern, value, pattern]
52
+ gen.swap
53
+
54
+ # [value, b pattern, value, pattern]
55
+ @b.assign(gen)
56
+
57
+ # [value, pattern]
58
+ gen.pop_many(2)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,185 @@
1
+ require "atomy/code/pattern"
2
+
3
+ require "atomy/node/meta"
4
+
5
+
6
+ class Atomy::Code::Pattern
7
+ class QuasiQuote < self
8
+ def initialize(node, mod)
9
+ constructor = Constructor.new(mod)
10
+ @pattern = constructor.go(node)
11
+ end
12
+
13
+ def bytecode(gen, mod)
14
+ gen.push_cpath_top
15
+ gen.find_const(:Atomy)
16
+ gen.find_const(:Pattern)
17
+ gen.find_const(:QuasiQuote)
18
+ mod.compile(gen, @pattern)
19
+ gen.send(:new, 1)
20
+ end
21
+
22
+ def assign(gen)
23
+ AssignWalker.new(gen).go(@pattern.node)
24
+ end
25
+
26
+ private
27
+
28
+ class Walker
29
+ def initialize
30
+ @depth = 0
31
+ end
32
+
33
+ def go(x)
34
+ x.accept(self)
35
+ end
36
+
37
+ def visit_quasiquote(qq)
38
+ @depth += 1
39
+ visit(qq)
40
+ ensure
41
+ @depth -= 1
42
+ end
43
+
44
+ def visit_unquote(x)
45
+ @depth -= 1
46
+
47
+ if @depth == 0
48
+ unquote(x)
49
+ else
50
+ visit(x)
51
+ end
52
+ ensure
53
+ @depth += 1
54
+ end
55
+
56
+ def unquote(_)
57
+ raise NotImplementedError
58
+ end
59
+ end
60
+
61
+ class Constructor < Walker
62
+ attr_reader :locals
63
+
64
+ def initialize(mod)
65
+ super()
66
+
67
+ @module = mod
68
+ end
69
+
70
+ def go(x)
71
+ x.accept(self)
72
+ end
73
+
74
+ def visit(x)
75
+ x.through do |v|
76
+ go(v)
77
+ end
78
+ end
79
+
80
+ def unquote(x)
81
+ x.through do |p|
82
+ @module.pattern(p)
83
+ end
84
+ end
85
+ end
86
+
87
+ class AssignWalker
88
+ def initialize(gen)
89
+ @gen = gen
90
+
91
+ # [[msg, [args...]]]
92
+ @path = []
93
+ end
94
+
95
+ def go(a)
96
+ if a.is_a?(Atomy::Code::Pattern)
97
+ @path.pop # remove .node call from following through the unquote
98
+ assign_using_path(a)
99
+ @path << :node # add it back so the parent .pop doesn't break
100
+ else
101
+ a.each_child do |attr, val|
102
+ @path << [attr, []]
103
+
104
+ if val.is_a?(Array)
105
+ go_array(val)
106
+ else
107
+ go(val)
108
+ end
109
+
110
+ @path.pop
111
+ end
112
+ end
113
+ end
114
+
115
+ def go_array(as)
116
+ splat = nil
117
+ req_size = 0
118
+ as.each do |a|
119
+ if a.is_a?(Atomy::Grammar::AST::Unquote) && a.node.is_a?(Atomy::Code::Pattern) && a.node.splat?
120
+ splat = a.node
121
+ break
122
+ end
123
+
124
+ req_size += 1
125
+ end
126
+
127
+ req_size.times do |i|
128
+ @path << [:[], [i]]
129
+ go(as[i])
130
+ @path.pop
131
+ end
132
+
133
+ if splat
134
+ assign_using_path(splat, req_size)
135
+ end
136
+
137
+ true
138
+ end
139
+
140
+ def assign_using_path(pattern, splat_index = nil)
141
+ @gen.dup_many(2)
142
+
143
+ # get path from value
144
+ push_path
145
+
146
+ if splat_index
147
+ @gen.push_int(splat_index)
148
+ @gen.send(:drop, 1)
149
+ end
150
+
151
+ @gen.swap
152
+
153
+ # get quasiquote tree of pattern
154
+ @gen.send(:node, 0)
155
+
156
+ # get path from pattern
157
+ push_path
158
+
159
+ if splat_index
160
+ @gen.push_int(splat_index)
161
+ @gen.send(:[], 1)
162
+ @gen.send(:pattern, 0)
163
+ end
164
+
165
+ # restore original order
166
+ @gen.swap
167
+
168
+ # assign sub-pattern against sub-value
169
+ pattern.assign(@gen)
170
+
171
+ @gen.pop_many(2)
172
+ end
173
+
174
+ def push_path
175
+ @path.each do |m, args|
176
+ args.each do |a|
177
+ @gen.push(a)
178
+ end
179
+
180
+ @gen.send(m, args.size)
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,29 @@
1
+ require "atomy/code/pattern"
2
+
3
+ require "atomy/node/meta"
4
+
5
+
6
+ class Atomy::Code::Pattern
7
+ class Splat < self
8
+ def initialize(pattern)
9
+ @pattern = pattern
10
+ end
11
+
12
+ def bytecode(gen, mod)
13
+ gen.push_cpath_top
14
+ gen.find_const(:Atomy)
15
+ gen.find_const(:Pattern)
16
+ gen.find_const(:Splat)
17
+ mod.compile(gen, @pattern)
18
+ gen.send(:new, 1)
19
+ end
20
+
21
+ def assign(gen)
22
+ @pattern.assign(gen)
23
+ end
24
+
25
+ def splat?
26
+ true
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ require "atomy/code/pattern"
2
+
3
+ require "atomy/node/meta"
4
+
5
+
6
+ class Atomy::Code::Pattern
7
+ class Wildcard < self
8
+ def initialize(name = nil, set = false)
9
+ @name = name
10
+ @set = set
11
+ end
12
+
13
+ def bytecode(gen, mod)
14
+ gen.push_cpath_top
15
+ gen.find_const(:Atomy)
16
+ gen.find_const(:Pattern)
17
+ gen.find_const(:Wildcard)
18
+ gen.send(:new, 0)
19
+ end
20
+
21
+ def assign(gen)
22
+ assignment_local(gen, @name, @set).set_bytecode(gen)
23
+ end
24
+
25
+ private
26
+
27
+ def assignment_local(gen, name, set = false)
28
+ var = gen.state.scope.search_local(name)
29
+
30
+ if var && (set || var.depth == 0)
31
+ var
32
+ else
33
+ gen.state.scope.new_local(name).nested_reference
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,118 @@
1
+ module Atomy
2
+ module Code
3
+ class QuasiQuote
4
+ attr_reader :node
5
+
6
+ def initialize(node)
7
+ @node = node
8
+ end
9
+
10
+ def bytecode(gen, mod)
11
+ Constructor.new(gen, mod).go(@node)
12
+ end
13
+
14
+ class Constructor
15
+ def initialize(gen, mod)
16
+ @gen = gen
17
+ @module = mod
18
+ @depth = 1
19
+ end
20
+
21
+ def go(x)
22
+ x.accept(self)
23
+ end
24
+
25
+ def unquote(x)
26
+ @module.compile(@gen, x.node)
27
+ end
28
+
29
+ def visit(x)
30
+ push_class(x.class)
31
+
32
+ args = 0
33
+ x.each_child do |_, c|
34
+ if c.is_a?(Array)
35
+ construct_many(c)
36
+ else
37
+ go(c)
38
+ end
39
+ args += 1
40
+ end
41
+
42
+ x.each_attribute do |_, a|
43
+ push_literal(a)
44
+ args += 1
45
+ end
46
+
47
+ @gen.send(:new, args)
48
+ end
49
+
50
+ def visit_quasiquote(qq)
51
+ @depth += 1
52
+ visit(qq)
53
+ ensure
54
+ @depth -= 1
55
+ end
56
+
57
+ def visit_unquote(x)
58
+ @depth -= 1
59
+
60
+ if @depth == 0
61
+ unquote(x)
62
+ else
63
+ visit(x)
64
+ end
65
+ ensure
66
+ @depth += 1
67
+ end
68
+
69
+ def construct_many(c)
70
+ size = 0
71
+ splats = 0
72
+ c.each do |e|
73
+ if @depth == 1 && e.is_a?(Atomy::Grammar::AST::Unquote) && \
74
+ e.node.is_a?(Atomy::Grammar::AST::Prefix) && \
75
+ e.node.operator == :*
76
+ splat = true
77
+ @gen.make_array(size)
78
+ @module.compile(@gen, e.node.node)
79
+ @gen.send(:+, 1)
80
+
81
+ splats += 1
82
+ size = 0
83
+ else
84
+ size += 1
85
+ go(e)
86
+ end
87
+ end
88
+
89
+ @gen.make_array(size)
90
+
91
+ splats.times do
92
+ @gen.send(:+, 1)
93
+ end
94
+ end
95
+
96
+ def push_literal(x)
97
+ case x
98
+ when Array
99
+ x.each { |v| push_literal(v) }
100
+ @gen.make_array(x.size)
101
+ when String
102
+ @gen.push_literal(x)
103
+ @gen.string_dup
104
+ else
105
+ @gen.push_literal(x)
106
+ end
107
+ end
108
+
109
+ def push_class(cls)
110
+ @gen.push_cpath_top
111
+ cls.name.split("::").each do |n|
112
+ @gen.find_const(n.to_sym)
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end