atomy 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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,135 @@
1
+ module Atomy
2
+ module AST
3
+ class Ensure < Node
4
+ children :body, :ensure
5
+ generate
6
+
7
+ def bytecode(g)
8
+ pos(g)
9
+
10
+ ok = g.new_label
11
+ ex = g.new_label
12
+ g.setup_unwind ex, Rubinius::AST::EnsureType
13
+
14
+ # TODO: ?
15
+ g.new_label.set!
16
+
17
+ g.push_exception_state
18
+ outer_exc_state = g.new_stack_local
19
+ g.set_stack_local outer_exc_state
20
+ g.pop
21
+
22
+ old_break = g.break
23
+ new_break = g.new_label
24
+ g.break = new_break
25
+
26
+ old_next = g.next
27
+ new_next = g.new_label
28
+ g.next = new_next
29
+
30
+ g.state.push_ensure
31
+ @body.compile(g)
32
+ g.state.pop_ensure
33
+
34
+ g.break = old_break
35
+ g.next = old_next
36
+
37
+ g.pop_unwind
38
+ g.goto ok
39
+
40
+ check_break = nil
41
+
42
+ if new_break.used?
43
+ used_break_local = g.new_stack_local
44
+ check_break = g.new_label
45
+
46
+ new_break.set!
47
+ g.pop_unwind
48
+
49
+ g.push :true
50
+ g.set_stack_local used_break_local
51
+ g.pop
52
+
53
+ g.goto check_break
54
+ end
55
+
56
+ check_next = nil
57
+
58
+ if new_next.used?
59
+ used_next_local = g.new_stack_local
60
+ check_next = g.new_label
61
+
62
+ new_next.set!
63
+ g.pop_unwind
64
+
65
+ g.push :true
66
+ g.set_stack_local used_next_local
67
+ g.pop
68
+
69
+ g.goto check_next
70
+ end
71
+
72
+ ex.set!
73
+
74
+ g.push_exception_state
75
+
76
+ g.state.push_rescue(outer_exc_state)
77
+ @ensure.compile(g)
78
+ g.state.pop_rescue
79
+ g.pop
80
+
81
+ g.restore_exception_state
82
+
83
+ # Re-raise the exception
84
+ g.reraise
85
+
86
+ ok.set!
87
+
88
+ if check_break
89
+ g.push :false
90
+ g.set_stack_local used_break_local
91
+ g.pop
92
+
93
+ check_break.set!
94
+ end
95
+
96
+ if check_next
97
+ g.push :false
98
+ g.set_stack_local used_next_local
99
+ g.pop
100
+
101
+ check_next.set!
102
+ end
103
+
104
+ # Now, re-emit the code for the ensure which will run if there was no
105
+ # exception generated.
106
+ @ensure.compile(g)
107
+ g.pop
108
+
109
+ if check_break
110
+ post = g.new_label
111
+
112
+ g.push_stack_local used_break_local
113
+ g.gif post
114
+
115
+ if g.break
116
+ g.goto g.break
117
+ else
118
+ g.raise_break
119
+ end
120
+ post.set!
121
+ end
122
+
123
+ if check_next
124
+ post = g.new_label
125
+
126
+ g.push_stack_local used_next_local
127
+ g.gif post
128
+
129
+ g.next ? g.goto(g.next) : g.ret
130
+ post.set!
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,14 @@
1
+ module Atomy
2
+ module AST
3
+ class File < Node
4
+ generate
5
+
6
+ def bytecode(g)
7
+ pos(g)
8
+ g.push_scope
9
+ g.send :active_path, 0
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,20 @@
1
+ module Atomy
2
+ module AST
3
+ class GlobalVariable < Node
4
+ attributes :identifier
5
+ generate
6
+
7
+ def name
8
+ ("$" + @identifier).to_sym
9
+ end
10
+
11
+ def bytecode(g)
12
+ pos(g)
13
+ g.push_rubinius
14
+ g.find_const :Globals
15
+ g.push_literal name
16
+ g.send :[], 1
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ module Atomy
2
+ module AST
3
+ class IfThenElse < Node
4
+ children :condition, :then, :else
5
+ generate
6
+
7
+ def bytecode(g)
8
+ done = g.new_label
9
+ nope = g.new_label
10
+
11
+ @condition.compile(g)
12
+ g.gif nope
13
+
14
+ @then.compile(g)
15
+ g.goto done
16
+
17
+ nope.set!
18
+ @else.compile(g)
19
+
20
+ done.set!
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module Atomy
2
+ module AST
3
+ class InstanceVariable < Node
4
+ attributes :identifier
5
+ generate
6
+
7
+ def name
8
+ ("@" + @identifier).to_sym
9
+ end
10
+
11
+ def bytecode(g)
12
+ pos(g)
13
+ g.push_ivar name
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ module Atomy
2
+ module AST
3
+ class LetMacro < Node
4
+ children :body, [:macros]
5
+ generate
6
+
7
+ def bytecode(g)
8
+ pos(g)
9
+
10
+ defined = {}
11
+ @macros.each do |m|
12
+ defined[m.pattern.method_name] =
13
+ m.pattern.register_macro m.body, true
14
+ end
15
+
16
+ @body.compile(g)
17
+
18
+ @macros.each do |m|
19
+ name = defined[m.pattern.method_name]
20
+
21
+ Atomy::Macro::Environment.singleton_class.remove_method(name)
22
+
23
+ meth = Atomy::Macro::Environment.let[m.pattern.method_name]
24
+ next unless meth && !meth.empty?
25
+
26
+ Atomy::Macro::Environment.singleton_class.send(
27
+ :define_method,
28
+ name,
29
+ meth.pop
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ module Atomy
2
+ module AST
3
+ class MacroQuote < Node
4
+ attributes :name, :contents, [:flags]
5
+ generate
6
+
7
+ def bytecode(g)
8
+ pos(g)
9
+ g.push_literal :impossible
10
+ end
11
+
12
+ def expand
13
+ Atomy::Macro::Environment.quote(
14
+ @name,
15
+ @contents,
16
+ @flags
17
+ ).to_node
18
+ end
19
+
20
+ alias :prepare :expand
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,53 @@
1
+ module Atomy
2
+ module AST
3
+ class Match < Node
4
+ children :target, :body
5
+ generate
6
+
7
+ def bytecode(g)
8
+ pos(g)
9
+
10
+ done = g.new_label
11
+
12
+ @target.compile(g)
13
+
14
+ @body.contents.each do |e|
15
+ MatchBranch.new(e.line, e.lhs, e.rhs).bytecode(g, done)
16
+ end
17
+
18
+ g.pop
19
+ g.push_nil
20
+
21
+ done.set!
22
+ end
23
+ end
24
+
25
+ class MatchBranch < InlinedBody
26
+ children :pattern, :branch
27
+ generate
28
+
29
+ def bytecode(g, done)
30
+ pos(g)
31
+
32
+ setup(g)
33
+
34
+ skip = g.new_label
35
+
36
+ pat = @pattern.to_pattern
37
+ exp = @branch
38
+
39
+ g.dup
40
+ pat.matches?(g)
41
+ g.gif skip
42
+
43
+ pat.deconstruct(g)
44
+ exp.compile(g)
45
+ g.goto done
46
+
47
+ skip.set!
48
+
49
+ reset(g)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,30 @@
1
+ module Atomy
2
+ module AST
3
+ class Module < Node
4
+ children :name, :body
5
+ generate
6
+
7
+ def module_name
8
+ case @name
9
+ when Constant
10
+ Rubinius::AST::ModuleName.new @line, @name.name
11
+ when ToplevelConstant
12
+ Rubinius::AST::ToplevelModuleName.new @line, @name
13
+ when ScopedConstant
14
+ Rubinius::AST::ScopedModuleName.new @line, @name
15
+ else
16
+ @name
17
+ end
18
+ end
19
+
20
+ def module_body
21
+ Rubinius::AST::ModuleScope.new @line, module_name, @body
22
+ end
23
+
24
+ def bytecode(g)
25
+ module_name.bytecode(g)
26
+ module_body.bytecode(g)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ module Atomy::AST
2
+ class Pattern < Node
3
+ attributes :pattern
4
+ generate
5
+
6
+ def construct(g, d = nil)
7
+ get(g)
8
+ g.push_int(@line)
9
+ @pattern.construct(g)
10
+ g.send :new, 2
11
+ end
12
+
13
+ def bytecode(g)
14
+ @pattern.construct(g)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ module Atomy
2
+ module AST
3
+ class Return < Node
4
+ children :value
5
+ generate
6
+
7
+ def bytecode(g, force = false)
8
+ if @value
9
+ @value.compile(g)
10
+ else
11
+ g.push_nil
12
+ end
13
+
14
+ if lcl = g.state.rescue?
15
+ g.push_stack_local lcl
16
+ g.restore_exception_state
17
+ end
18
+
19
+ if g.state.block?
20
+ g.raise_return
21
+ elsif !force and g.state.ensure?
22
+ g.ensure_return
23
+ else
24
+ g.ret
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ module Atomy
2
+ module AST
3
+ class Set < Node
4
+ children :lhs, :rhs
5
+ generate
6
+
7
+ def bytecode(g)
8
+ pos(g)
9
+
10
+ if @lhs.respond_to?(:assign)
11
+ @lhs.assign(g, @rhs)
12
+ return
13
+ end
14
+
15
+ @lhs.to_pattern.assign(g, @rhs, true)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Atomy
2
+ module AST
3
+ class SingletonClass < Node
4
+ children :receiver, :body
5
+ generate
6
+
7
+ def sclass_body
8
+ Rubinius::AST::SClassScope.new @line, @body
9
+ end
10
+
11
+ def bytecode(g)
12
+ pos(g)
13
+ @receiver.compile(g)
14
+ sclass_body.bytecode(g)
15
+ end
16
+ end
17
+ end
18
+ end