atomy 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. data/COPYING +30 -0
  2. data/README.md +1 -0
  3. data/bin/atomy +134 -0
  4. data/kernel/block.ay +30 -0
  5. data/kernel/boot.ay +10 -0
  6. data/kernel/comparison.ay +61 -0
  7. data/kernel/concurrency.ay +84 -0
  8. data/kernel/condition.ay +277 -0
  9. data/kernel/control-flow.ay +222 -0
  10. data/kernel/cosmetics.ay +3 -0
  11. data/kernel/data-delta.ay +105 -0
  12. data/kernel/data.ay +56 -0
  13. data/kernel/define.ay +93 -0
  14. data/kernel/doc.ay +453 -0
  15. data/kernel/documentation.ay +135 -0
  16. data/kernel/dynamic.ay +42 -0
  17. data/kernel/errors.ay +6 -0
  18. data/kernel/format.ay +13 -0
  19. data/kernel/format/data.ay +89 -0
  20. data/kernel/format/formatter.ay +345 -0
  21. data/kernel/format/parser.ay +13 -0
  22. data/kernel/hashes.ay +39 -0
  23. data/kernel/io.ay +244 -0
  24. data/kernel/namespaces.ay +63 -0
  25. data/kernel/node.ay +48 -0
  26. data/kernel/operators.ay +28 -0
  27. data/kernel/particles.ay +53 -0
  28. data/kernel/patterns.ay +256 -0
  29. data/kernel/precision.ay +148 -0
  30. data/kernel/pretty.ay +283 -0
  31. data/kernel/repl.ay +140 -0
  32. data/kernel/therie.ay +204 -0
  33. data/lib/ast/binary_send.rb +44 -0
  34. data/lib/ast/block.rb +268 -0
  35. data/lib/ast/constant.rb +88 -0
  36. data/lib/ast/internal/assign.rb +19 -0
  37. data/lib/ast/internal/block_pass.rb +21 -0
  38. data/lib/ast/internal/catch.rb +247 -0
  39. data/lib/ast/internal/class.rb +30 -0
  40. data/lib/ast/internal/class_variable.rb +23 -0
  41. data/lib/ast/internal/define.rb +174 -0
  42. data/lib/ast/internal/ensure.rb +135 -0
  43. data/lib/ast/internal/file.rb +14 -0
  44. data/lib/ast/internal/global_variable.rb +20 -0
  45. data/lib/ast/internal/if_then_else.rb +24 -0
  46. data/lib/ast/internal/instance_variable.rb +17 -0
  47. data/lib/ast/internal/let_macro.rb +35 -0
  48. data/lib/ast/internal/macro_quote.rb +23 -0
  49. data/lib/ast/internal/match.rb +53 -0
  50. data/lib/ast/internal/module.rb +30 -0
  51. data/lib/ast/internal/pattern.rb +17 -0
  52. data/lib/ast/internal/return.rb +29 -0
  53. data/lib/ast/internal/set.rb +19 -0
  54. data/lib/ast/internal/singleton_class.rb +18 -0
  55. data/lib/ast/internal/splat.rb +14 -0
  56. data/lib/ast/internal/when.rb +24 -0
  57. data/lib/ast/list.rb +25 -0
  58. data/lib/ast/macro.rb +37 -0
  59. data/lib/ast/node.rb +599 -0
  60. data/lib/ast/operator.rb +21 -0
  61. data/lib/ast/particle.rb +13 -0
  62. data/lib/ast/primitive.rb +20 -0
  63. data/lib/ast/quasi_quote.rb +20 -0
  64. data/lib/ast/quote.rb +13 -0
  65. data/lib/ast/send.rb +104 -0
  66. data/lib/ast/splice.rb +32 -0
  67. data/lib/ast/string.rb +23 -0
  68. data/lib/ast/unary.rb +44 -0
  69. data/lib/ast/unquote.rb +45 -0
  70. data/lib/ast/variable.rb +64 -0
  71. data/lib/atomy.kpeg.rb +3995 -0
  72. data/lib/code_loader.rb +137 -0
  73. data/lib/compiler/compiler.rb +155 -0
  74. data/lib/compiler/stages.rb +81 -0
  75. data/lib/formatter.kpeg.rb +1394 -0
  76. data/lib/macros.rb +317 -0
  77. data/lib/method.rb +261 -0
  78. data/lib/namespace.rb +236 -0
  79. data/lib/parser.rb +28 -0
  80. data/lib/patterns.rb +276 -0
  81. data/lib/patterns/any.rb +21 -0
  82. data/lib/patterns/attribute.rb +59 -0
  83. data/lib/patterns/block_pass.rb +54 -0
  84. data/lib/patterns/constant.rb +33 -0
  85. data/lib/patterns/default.rb +44 -0
  86. data/lib/patterns/head_tail.rb +63 -0
  87. data/lib/patterns/list.rb +77 -0
  88. data/lib/patterns/match.rb +45 -0
  89. data/lib/patterns/named.rb +55 -0
  90. data/lib/patterns/named_class.rb +46 -0
  91. data/lib/patterns/named_global.rb +46 -0
  92. data/lib/patterns/named_instance.rb +46 -0
  93. data/lib/patterns/particle.rb +29 -0
  94. data/lib/patterns/quasi_quote.rb +184 -0
  95. data/lib/patterns/quote.rb +33 -0
  96. data/lib/patterns/singleton_class.rb +31 -0
  97. data/lib/patterns/splat.rb +57 -0
  98. data/lib/util.rb +37 -0
  99. metadata +164 -0
@@ -0,0 +1,46 @@
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
@@ -0,0 +1,46 @@
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
@@ -0,0 +1,46 @@
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
@@ -0,0 +1,29 @@
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
@@ -0,0 +1,184 @@
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
@@ -0,0 +1,33 @@
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
@@ -0,0 +1,31 @@
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
@@ -0,0 +1,57 @@
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