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,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