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.
- data/COPYING +30 -0
- data/README.md +1 -0
- data/bin/atomy +134 -0
- data/kernel/block.ay +30 -0
- data/kernel/boot.ay +10 -0
- data/kernel/comparison.ay +61 -0
- data/kernel/concurrency.ay +84 -0
- data/kernel/condition.ay +277 -0
- data/kernel/control-flow.ay +222 -0
- data/kernel/cosmetics.ay +3 -0
- data/kernel/data-delta.ay +105 -0
- data/kernel/data.ay +56 -0
- data/kernel/define.ay +93 -0
- data/kernel/doc.ay +453 -0
- data/kernel/documentation.ay +135 -0
- data/kernel/dynamic.ay +42 -0
- data/kernel/errors.ay +6 -0
- data/kernel/format.ay +13 -0
- data/kernel/format/data.ay +89 -0
- data/kernel/format/formatter.ay +345 -0
- data/kernel/format/parser.ay +13 -0
- data/kernel/hashes.ay +39 -0
- data/kernel/io.ay +244 -0
- data/kernel/namespaces.ay +63 -0
- data/kernel/node.ay +48 -0
- data/kernel/operators.ay +28 -0
- data/kernel/particles.ay +53 -0
- data/kernel/patterns.ay +256 -0
- data/kernel/precision.ay +148 -0
- data/kernel/pretty.ay +283 -0
- data/kernel/repl.ay +140 -0
- data/kernel/therie.ay +204 -0
- data/lib/ast/binary_send.rb +44 -0
- data/lib/ast/block.rb +268 -0
- data/lib/ast/constant.rb +88 -0
- data/lib/ast/internal/assign.rb +19 -0
- data/lib/ast/internal/block_pass.rb +21 -0
- data/lib/ast/internal/catch.rb +247 -0
- data/lib/ast/internal/class.rb +30 -0
- data/lib/ast/internal/class_variable.rb +23 -0
- data/lib/ast/internal/define.rb +174 -0
- data/lib/ast/internal/ensure.rb +135 -0
- data/lib/ast/internal/file.rb +14 -0
- data/lib/ast/internal/global_variable.rb +20 -0
- data/lib/ast/internal/if_then_else.rb +24 -0
- data/lib/ast/internal/instance_variable.rb +17 -0
- data/lib/ast/internal/let_macro.rb +35 -0
- data/lib/ast/internal/macro_quote.rb +23 -0
- data/lib/ast/internal/match.rb +53 -0
- data/lib/ast/internal/module.rb +30 -0
- data/lib/ast/internal/pattern.rb +17 -0
- data/lib/ast/internal/return.rb +29 -0
- data/lib/ast/internal/set.rb +19 -0
- data/lib/ast/internal/singleton_class.rb +18 -0
- data/lib/ast/internal/splat.rb +14 -0
- data/lib/ast/internal/when.rb +24 -0
- data/lib/ast/list.rb +25 -0
- data/lib/ast/macro.rb +37 -0
- data/lib/ast/node.rb +599 -0
- data/lib/ast/operator.rb +21 -0
- data/lib/ast/particle.rb +13 -0
- data/lib/ast/primitive.rb +20 -0
- data/lib/ast/quasi_quote.rb +20 -0
- data/lib/ast/quote.rb +13 -0
- data/lib/ast/send.rb +104 -0
- data/lib/ast/splice.rb +32 -0
- data/lib/ast/string.rb +23 -0
- data/lib/ast/unary.rb +44 -0
- data/lib/ast/unquote.rb +45 -0
- data/lib/ast/variable.rb +64 -0
- data/lib/atomy.kpeg.rb +3995 -0
- data/lib/code_loader.rb +137 -0
- data/lib/compiler/compiler.rb +155 -0
- data/lib/compiler/stages.rb +81 -0
- data/lib/formatter.kpeg.rb +1394 -0
- data/lib/macros.rb +317 -0
- data/lib/method.rb +261 -0
- data/lib/namespace.rb +236 -0
- data/lib/parser.rb +28 -0
- data/lib/patterns.rb +276 -0
- data/lib/patterns/any.rb +21 -0
- data/lib/patterns/attribute.rb +59 -0
- data/lib/patterns/block_pass.rb +54 -0
- data/lib/patterns/constant.rb +33 -0
- data/lib/patterns/default.rb +44 -0
- data/lib/patterns/head_tail.rb +63 -0
- data/lib/patterns/list.rb +77 -0
- data/lib/patterns/match.rb +45 -0
- data/lib/patterns/named.rb +55 -0
- data/lib/patterns/named_class.rb +46 -0
- data/lib/patterns/named_global.rb +46 -0
- data/lib/patterns/named_instance.rb +46 -0
- data/lib/patterns/particle.rb +29 -0
- data/lib/patterns/quasi_quote.rb +184 -0
- data/lib/patterns/quote.rb +33 -0
- data/lib/patterns/singleton_class.rb +31 -0
- data/lib/patterns/splat.rb +57 -0
- data/lib/util.rb +37 -0
- 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,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,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
|