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
@@ -1,46 +0,0 @@
1
- module Atomy::Patterns
2
- class NamedClass < Pattern
3
- attr_reader :identifier
4
-
5
- def initialize(n)
6
- @identifier = n
7
- end
8
-
9
- def name
10
- ("@@" + @identifier).to_sym
11
- end
12
-
13
- def construct(g)
14
- get(g)
15
- g.push_literal @identifier
16
- g.send :new, 1
17
- end
18
-
19
- def ==(b)
20
- b.kind_of?(NamedClass) and \
21
- @identifier == b.identifier
22
- end
23
-
24
- def target(g)
25
- g.push_const :Object
26
- end
27
-
28
- def matches?(g)
29
- g.pop
30
- g.push_true
31
- end
32
-
33
- def deconstruct(g, locals = {})
34
- Rubinius::AST::ClassVariableAssignment.new(0, name, nil).bytecode(g)
35
- g.pop
36
- end
37
-
38
- def local_names
39
- []
40
- end
41
-
42
- def bindings
43
- 1
44
- end
45
- end
46
- end
@@ -1,46 +0,0 @@
1
- module Atomy::Patterns
2
- class NamedGlobal < Pattern
3
- attr_reader :identifier
4
-
5
- def initialize(n)
6
- @identifier = n
7
- end
8
-
9
- def name
10
- ("$" + @identifier).to_sym
11
- end
12
-
13
- def construct(g)
14
- get(g)
15
- g.push_literal @identifier
16
- g.send :new, 1
17
- end
18
-
19
- def ==(b)
20
- b.kind_of?(NamedGlobal) and \
21
- @identifier == b.identifier
22
- end
23
-
24
- def target(g)
25
- g.push_const :Object
26
- end
27
-
28
- def matches?(g)
29
- g.pop
30
- g.push_true
31
- end
32
-
33
- def deconstruct(g, locals = {})
34
- Rubinius::AST::GlobalVariableAssignment.new(0, name, nil).bytecode(g)
35
- g.pop
36
- end
37
-
38
- def local_names
39
- []
40
- end
41
-
42
- def bindings
43
- 1
44
- end
45
- end
46
- end
@@ -1,46 +0,0 @@
1
- module Atomy::Patterns
2
- class NamedInstance < Pattern
3
- attr_reader :identifier
4
-
5
- def initialize(n)
6
- @identifier = n
7
- end
8
-
9
- def name
10
- ("@" + @identifier).to_sym
11
- end
12
-
13
- def construct(g)
14
- get(g)
15
- g.push_literal @identifier
16
- g.send :new, 1
17
- end
18
-
19
- def ==(b)
20
- b.kind_of?(NamedInstance) and \
21
- @identifier == b.identifier
22
- end
23
-
24
- def target(g)
25
- g.push_const :Object
26
- end
27
-
28
- def matches?(g)
29
- g.pop
30
- g.push_true
31
- end
32
-
33
- def deconstruct(g, locals = {})
34
- Rubinius::AST::InstanceVariableAssignment.new(0, name, nil).bytecode(g)
35
- g.pop
36
- end
37
-
38
- def local_names
39
- []
40
- end
41
-
42
- def bindings
43
- 1
44
- end
45
- end
46
- end
@@ -1,29 +0,0 @@
1
- module Atomy::Patterns
2
- class Particle < Pattern
3
- attr_reader :value
4
-
5
- def initialize(x)
6
- @value = x
7
- end
8
-
9
- def construct(g)
10
- get(g)
11
- g.push_literal @value
12
- g.send :new, 1
13
- end
14
-
15
- def ==(b)
16
- b.kind_of?(Match) and \
17
- @value == b.value
18
- end
19
-
20
- def target(g)
21
- g.push_const :Symbol # TODO
22
- end
23
-
24
- def matches?(g)
25
- g.push_literal @value
26
- g.send :==, 1
27
- end
28
- end
29
- end
@@ -1,184 +0,0 @@
1
- # TODO: fix splice unquotes
2
- module Atomy::Patterns
3
- class QuasiQuote < Pattern
4
- attr_reader :quoted
5
-
6
- def initialize(x)
7
- @quoted = x
8
- end
9
-
10
- def construct(g)
11
- get(g)
12
- @quoted.construct(g, nil)
13
- g.send :new, 1
14
- end
15
-
16
- def ==(b)
17
- b.kind_of?(QuasiQuote) and \
18
- @quoted == b.expression
19
- end
20
-
21
- def expression
22
- @quoted.expression
23
- end
24
-
25
- def target(g)
26
- names = expression.class.name.split("::")
27
- g.push_const names.slice!(0).to_sym
28
- names.each do |n|
29
- g.find_const n.to_sym
30
- end
31
- end
32
-
33
- def context(g, w)
34
- w.each do |c|
35
- # TODO: fail if out of bounds?
36
- # e.g. `(foo(~bar, ~baz)) = '(foo(1))
37
- if c.kind_of?(Array)
38
- g.send c[0], 0
39
- g.push_int c[1]
40
- g.send :[], 1
41
- else
42
- g.send c, 0
43
- end
44
- end
45
- end
46
-
47
- def matches?(g)
48
- mismatch = g.new_label
49
- done = g.new_label
50
-
51
- them = g.new_stack_local
52
- g.set_stack_local them
53
- g.pop
54
-
55
- where = nil
56
- splice = false
57
-
58
- pre = proc { |e, c, d|
59
- where << c if c && where
60
-
61
- where = [] if !where and c == :expression
62
-
63
- splice = true if e.kind_of?(Atomy::AST::Splice)
64
-
65
- if !(e.unquote? && d == 1) && where && c != :unquoted
66
- e.get(g)
67
- g.push_stack_local them
68
- context(g, where)
69
- g.kind_of
70
- g.gif mismatch
71
-
72
- e.details.each do |a|
73
- val = e.send(a)
74
- if val.kind_of?(Array)
75
- val.each do |v|
76
- g.push_literal v
77
- end
78
- g.make_array val.size
79
- else
80
- g.push_literal val
81
- end
82
- g.push_stack_local them
83
- context(g, where)
84
- g.send a, 0
85
- g.send :==, 1
86
- g.gif mismatch
87
- end
88
-
89
- if e.bottom?
90
- e.construct(g)
91
- g.push_stack_local them
92
- context(g, where)
93
- g.send :==, 1
94
- g.gif mismatch
95
- end
96
- end
97
-
98
- true
99
- }
100
-
101
- post = proc { where.pop }
102
-
103
- @quoted.through_quotes(pre, post) do |e|
104
- ctx = where.last == :unquoted ? where[0..-2] : where
105
- g.push_stack_local them
106
- if splice
107
- g.send ctx.last[0], 0
108
- g.push_int ctx.last[1]
109
- g.send :drop, 1
110
- splice = false
111
- else
112
- context(g, ctx)
113
- end
114
- e.to_pattern.matches?(g)
115
- g.gif mismatch
116
- e
117
- end
118
-
119
- g.push_true
120
- g.goto done
121
-
122
- mismatch.set!
123
- g.push_false
124
-
125
- done.set!
126
- end
127
-
128
- def deconstruct(g, locals = {})
129
- them = g.new_stack_local
130
- g.set_stack_local them
131
- g.pop
132
-
133
- where = nil
134
- splice = false
135
-
136
- pre = proc { |n, c|
137
- where << c if c && where
138
-
139
- where = [] if !where and c == :expression
140
-
141
- splice = true if n.kind_of?(Atomy::AST::Splice)
142
-
143
- true
144
- }
145
-
146
- post = proc { where.pop }
147
-
148
- @quoted.through_quotes(pre, post) do |e|
149
- ctx = where.last == :unquoted ? where[0..-2] : where
150
- g.push_stack_local them
151
- if splice
152
- g.send ctx.last[0], 0
153
- g.push_int ctx.last[1]
154
- g.send :drop, 1
155
- splice = false
156
- else
157
- context(g, ctx)
158
- end
159
- e.to_pattern.deconstruct(g)
160
- e
161
- end
162
- end
163
-
164
- def local_names
165
- names = []
166
-
167
- @quoted.through_quotes(proc { true }) do |e|
168
- names += e.to_pattern.local_names
169
- end
170
-
171
- names
172
- end
173
-
174
- def bindings
175
- bindings = 0
176
-
177
- @quoted.through_quotes(proc { true }) do |e|
178
- bindings += e.to_pattern.bindings
179
- end
180
-
181
- bindings
182
- end
183
- end
184
- end
@@ -1,33 +0,0 @@
1
- module Atomy::Patterns
2
- class Quote < Pattern
3
- attr_reader :expression
4
-
5
- def initialize(x)
6
- @expression = x
7
- end
8
-
9
- def construct(g)
10
- get(g)
11
- @expression.construct(g, nil)
12
- g.send :new, 1
13
- end
14
-
15
- def ==(b)
16
- b.kind_of?(Quote) and \
17
- @expression == b.expression
18
- end
19
-
20
- def target(g)
21
- names = @expression.class.name.split("::")
22
- g.push_const names.slice!(0).to_sym
23
- names.each do |n|
24
- g.find_const n.to_sym
25
- end
26
- end
27
-
28
- def matches?(g)
29
- @expression.construct(g, nil)
30
- g.send :==, 1
31
- end
32
- end
33
- end
@@ -1,31 +0,0 @@
1
- module Atomy::Patterns
2
- class SingletonClass < Pattern
3
- attr_reader :body
4
-
5
- def initialize(body)
6
- @body = body
7
- end
8
-
9
- def construct(g)
10
- get(g)
11
- @body.construct(g, nil)
12
- g.send(:new, 1)
13
- end
14
-
15
- def ==(b)
16
- b.kind_of?(SingletonClass) and \
17
- @body == b.body
18
- end
19
-
20
- def target(g)
21
- @body.compile(g)
22
- g.send :call, 0
23
- g.send :singleton_class, 0
24
- end
25
-
26
- def matches?(g)
27
- g.pop
28
- g.push_true
29
- end
30
- end
31
- end
@@ -1,57 +0,0 @@
1
- module Atomy::Patterns
2
- class Splat < Pattern
3
- attr_accessor :pattern
4
-
5
- def initialize(p)
6
- @pattern = p
7
- end
8
-
9
- def construct(g)
10
- get(g)
11
- @pattern.construct(g)
12
- g.send :new, 1
13
- end
14
-
15
- def ==(b)
16
- b.kind_of?(Splat) and \
17
- @pattern == b.pattern
18
- end
19
-
20
- def target(g)
21
- g.push_const :Object
22
- end
23
-
24
- def matches?(g)
25
- g.pop
26
- g.push_true
27
- end
28
-
29
- def deconstruct(g, locals = {})
30
- singleton = g.new_label
31
- done = g.new_label
32
-
33
- g.dup
34
- g.push_const :Array
35
- g.swap
36
- g.instance_of
37
- g.git singleton
38
-
39
- g.cast_array
40
- g.goto done
41
-
42
- singleton.set!
43
- g.make_array 1
44
-
45
- done.set!
46
- @pattern.deconstruct(g, locals)
47
- end
48
-
49
- def local_names
50
- @pattern.local_names
51
- end
52
-
53
- def bindings
54
- @pattern.bindings
55
- end
56
- end
57
- end