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