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
data/lib/patterns/any.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class Any < Pattern
|
3
|
+
def construct(g)
|
4
|
+
get(g)
|
5
|
+
g.send :new, 0
|
6
|
+
end
|
7
|
+
|
8
|
+
def ==(b)
|
9
|
+
b.kind_of?(Any)
|
10
|
+
end
|
11
|
+
|
12
|
+
def target(g)
|
13
|
+
g.push_const :Object
|
14
|
+
end
|
15
|
+
|
16
|
+
def matches?(g)
|
17
|
+
g.pop
|
18
|
+
g.push_true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class Attribute < Pattern
|
3
|
+
attr_reader :receiver, :name, :arguments
|
4
|
+
|
5
|
+
def initialize(r, n, as = [])
|
6
|
+
@receiver = r
|
7
|
+
@name = n
|
8
|
+
@arguments = as
|
9
|
+
end
|
10
|
+
|
11
|
+
def construct(g)
|
12
|
+
get(g)
|
13
|
+
@receiver.construct(g, nil)
|
14
|
+
g.push_literal @name
|
15
|
+
@arguments.each do |a|
|
16
|
+
a.construct(g)
|
17
|
+
end
|
18
|
+
g.make_array @arguments.size
|
19
|
+
g.send :new, 3
|
20
|
+
end
|
21
|
+
|
22
|
+
def ==(b)
|
23
|
+
b.kind_of?(Attribute) and \
|
24
|
+
@receiver == b.receiver and \
|
25
|
+
@name == b.name and \
|
26
|
+
@arguments == b.arguments
|
27
|
+
end
|
28
|
+
|
29
|
+
def target(g)
|
30
|
+
# this should be pretty rare, but seems sensible
|
31
|
+
@receiver.construct(g)
|
32
|
+
end
|
33
|
+
|
34
|
+
def matches?(g)
|
35
|
+
g.pop
|
36
|
+
g.push_true
|
37
|
+
end
|
38
|
+
|
39
|
+
def deconstruct(g, locals = {})
|
40
|
+
@receiver.compile(g)
|
41
|
+
g.swap
|
42
|
+
@arguments.each do |a|
|
43
|
+
a.compile(g)
|
44
|
+
g.swap
|
45
|
+
end
|
46
|
+
g.send((@name + "=").to_sym, 1 + @arguments.size)
|
47
|
+
g.pop
|
48
|
+
end
|
49
|
+
|
50
|
+
def local_names
|
51
|
+
[]
|
52
|
+
end
|
53
|
+
|
54
|
+
def bindings
|
55
|
+
1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class BlockPass < Pattern
|
3
|
+
attr_reader :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?(BlockPass) 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
|
+
nil_block = g.new_label
|
31
|
+
done = g.new_label
|
32
|
+
|
33
|
+
g.dup
|
34
|
+
g.is_nil
|
35
|
+
g.git nil_block
|
36
|
+
|
37
|
+
g.push_cpath_top
|
38
|
+
g.find_const :Proc
|
39
|
+
g.swap
|
40
|
+
g.send :__from_block__, 1
|
41
|
+
@pattern.deconstruct(g, locals)
|
42
|
+
g.goto done
|
43
|
+
|
44
|
+
nil_block.set!
|
45
|
+
g.pop
|
46
|
+
|
47
|
+
done.set!
|
48
|
+
end
|
49
|
+
|
50
|
+
def local_names
|
51
|
+
@pattern.local_names
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class Constant < Pattern
|
3
|
+
attr_reader :constant, :ancestors
|
4
|
+
|
5
|
+
def initialize(constant, ancestors = nil)
|
6
|
+
@constant = constant
|
7
|
+
@ancestors = ancestors
|
8
|
+
end
|
9
|
+
|
10
|
+
def construct(g)
|
11
|
+
get(g)
|
12
|
+
@constant.construct(g)
|
13
|
+
@constant.bytecode(g)
|
14
|
+
g.send :ancestors, 0
|
15
|
+
g.send :new, 2
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(b)
|
19
|
+
b.kind_of?(Constant) and \
|
20
|
+
@constant == b.constant
|
21
|
+
end
|
22
|
+
|
23
|
+
def target(g)
|
24
|
+
@constant.bytecode(g)
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(g)
|
28
|
+
target(g)
|
29
|
+
g.swap
|
30
|
+
g.kind_of
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class Default < Pattern
|
3
|
+
attr_reader :pattern, :default
|
4
|
+
|
5
|
+
def initialize(p, d)
|
6
|
+
@pattern = p
|
7
|
+
@default = d
|
8
|
+
end
|
9
|
+
|
10
|
+
def construct(g)
|
11
|
+
get(g)
|
12
|
+
@pattern.construct(g)
|
13
|
+
@default.construct(g, nil)
|
14
|
+
g.send :new, 2
|
15
|
+
end
|
16
|
+
|
17
|
+
def ==(b)
|
18
|
+
b.kind_of?(Default) and \
|
19
|
+
@pattern == b.pattern and \
|
20
|
+
@default == b.default
|
21
|
+
end
|
22
|
+
|
23
|
+
def target(g)
|
24
|
+
@pattern.target(g)
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(g)
|
28
|
+
@pattern.matches?(g)
|
29
|
+
end
|
30
|
+
|
31
|
+
def deconstruct(g, locals = {})
|
32
|
+
@pattern.deconstruct(g, locals)
|
33
|
+
end
|
34
|
+
|
35
|
+
def local_names
|
36
|
+
@pattern.local_names
|
37
|
+
end
|
38
|
+
|
39
|
+
def bindings
|
40
|
+
@pattern.bindings
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class HeadTail < Pattern
|
3
|
+
attr_reader :head, :tail
|
4
|
+
|
5
|
+
def initialize(head, tail)
|
6
|
+
@head = head
|
7
|
+
@tail = tail
|
8
|
+
end
|
9
|
+
|
10
|
+
def construct(g)
|
11
|
+
get(g)
|
12
|
+
@head.construct(g)
|
13
|
+
@tail.construct(g)
|
14
|
+
g.send :new, 2
|
15
|
+
end
|
16
|
+
|
17
|
+
def ==(b)
|
18
|
+
b.kind_of?(HeadTail) and \
|
19
|
+
@head == b.head and \
|
20
|
+
@tail == b.tail
|
21
|
+
end
|
22
|
+
|
23
|
+
def target(g)
|
24
|
+
g.push_const :Array
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(g)
|
28
|
+
mismatch = g.new_label
|
29
|
+
matched = g.new_label
|
30
|
+
|
31
|
+
g.dup
|
32
|
+
g.send :empty?, 0
|
33
|
+
g.git mismatch
|
34
|
+
|
35
|
+
g.shift_array
|
36
|
+
@head.matches?(g)
|
37
|
+
g.gif mismatch
|
38
|
+
|
39
|
+
@tail.matches?(g)
|
40
|
+
g.goto matched
|
41
|
+
|
42
|
+
mismatch.set!
|
43
|
+
g.pop
|
44
|
+
g.push_false
|
45
|
+
|
46
|
+
matched.set!
|
47
|
+
end
|
48
|
+
|
49
|
+
def deconstruct(g, locals = {})
|
50
|
+
g.shift_array
|
51
|
+
@head.deconstruct(g, locals)
|
52
|
+
@tail.deconstruct(g, locals)
|
53
|
+
end
|
54
|
+
|
55
|
+
def local_names
|
56
|
+
@head.local_names + @tail.local_names
|
57
|
+
end
|
58
|
+
|
59
|
+
def bindings
|
60
|
+
@head.bindings + @tail.bindings
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class List < Pattern
|
3
|
+
attr_reader :patterns
|
4
|
+
|
5
|
+
def initialize(ps)
|
6
|
+
@patterns = ps
|
7
|
+
end
|
8
|
+
|
9
|
+
def construct(g)
|
10
|
+
get(g)
|
11
|
+
@patterns.each do |p|
|
12
|
+
p.construct(g)
|
13
|
+
end
|
14
|
+
g.make_array @patterns.size
|
15
|
+
g.send :new, 1
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(b)
|
19
|
+
b.kind_of?(List) and \
|
20
|
+
@patterns == b.patterns
|
21
|
+
end
|
22
|
+
|
23
|
+
def target(g)
|
24
|
+
g.push_const :Array
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(g)
|
28
|
+
matched = g.new_label
|
29
|
+
mismatch = g.new_label
|
30
|
+
|
31
|
+
g.dup
|
32
|
+
g.push_cpath_top
|
33
|
+
g.find_const :Array
|
34
|
+
g.swap
|
35
|
+
g.kind_of
|
36
|
+
g.gif mismatch
|
37
|
+
|
38
|
+
g.dup
|
39
|
+
g.send :size, 0
|
40
|
+
g.push @patterns.size
|
41
|
+
g.send :==, 1
|
42
|
+
g.gif mismatch
|
43
|
+
|
44
|
+
@patterns.each do |p|
|
45
|
+
g.shift_array
|
46
|
+
p.matches?(g)
|
47
|
+
g.gif mismatch
|
48
|
+
end
|
49
|
+
g.pop
|
50
|
+
|
51
|
+
g.push_true
|
52
|
+
g.goto matched
|
53
|
+
|
54
|
+
mismatch.set!
|
55
|
+
g.pop
|
56
|
+
g.push_false
|
57
|
+
|
58
|
+
matched.set!
|
59
|
+
end
|
60
|
+
|
61
|
+
def deconstruct(g, locals = {})
|
62
|
+
@patterns.each do |p|
|
63
|
+
g.shift_array
|
64
|
+
p.deconstruct(g, locals)
|
65
|
+
end
|
66
|
+
g.pop
|
67
|
+
end
|
68
|
+
|
69
|
+
def local_names
|
70
|
+
@patterns.collect { |p| p.local_names }.flatten
|
71
|
+
end
|
72
|
+
|
73
|
+
def bindings
|
74
|
+
@patterns.reduce(0) { |a, p| p.bindings + a }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class Match < 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
|
+
case @value
|
22
|
+
when :true
|
23
|
+
g.push_const :TrueClass
|
24
|
+
when :false
|
25
|
+
g.push_const :FalseClass
|
26
|
+
when :nil
|
27
|
+
g.push_const :NilClass
|
28
|
+
when :self
|
29
|
+
g.push_self
|
30
|
+
else
|
31
|
+
g.push_const @value.class.name.to_sym
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def matches?(g)
|
36
|
+
case @value
|
37
|
+
when :true, :false, :self, :nil, Integer
|
38
|
+
g.push @value
|
39
|
+
else
|
40
|
+
g.push_literal @value
|
41
|
+
end
|
42
|
+
g.send :==, 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Atomy::Patterns
|
2
|
+
class Named < Pattern
|
3
|
+
attr_reader :name, :pattern
|
4
|
+
|
5
|
+
def initialize(n, p)
|
6
|
+
@name = n
|
7
|
+
@pattern = p
|
8
|
+
end
|
9
|
+
|
10
|
+
def construct(g)
|
11
|
+
get(g)
|
12
|
+
g.push_literal @name
|
13
|
+
@pattern.construct(g)
|
14
|
+
g.send :new, 2
|
15
|
+
end
|
16
|
+
|
17
|
+
def ==(b)
|
18
|
+
b.kind_of?(Named) and \
|
19
|
+
@name == b.name and \
|
20
|
+
@pattern == b.pattern
|
21
|
+
end
|
22
|
+
|
23
|
+
def target(g)
|
24
|
+
@pattern.target(g)
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(g)
|
28
|
+
@pattern.matches?(g)
|
29
|
+
end
|
30
|
+
|
31
|
+
def deconstruct(g, locals = {})
|
32
|
+
if locals[@name]
|
33
|
+
local = locals[@name]
|
34
|
+
else
|
35
|
+
local = Atomy.assign_local(g, @name)
|
36
|
+
end
|
37
|
+
|
38
|
+
if @pattern.bindings > 0
|
39
|
+
g.dup
|
40
|
+
@pattern.deconstruct(g, locals)
|
41
|
+
end
|
42
|
+
|
43
|
+
local.set_bytecode(g)
|
44
|
+
g.pop
|
45
|
+
end
|
46
|
+
|
47
|
+
def local_names
|
48
|
+
[@name] + @pattern.local_names
|
49
|
+
end
|
50
|
+
|
51
|
+
def bindings
|
52
|
+
1 + @pattern.bindings
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|