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