atomy 0.1.1 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +13 -0
  3. data/LICENSE.md +201 -0
  4. data/bin/atomy +16 -133
  5. data/kernel/array.ay +6 -0
  6. data/kernel/atomy.ay +18 -0
  7. data/kernel/condition.ay +171 -271
  8. data/kernel/control-flow.ay +197 -192
  9. data/kernel/core.ay +120 -0
  10. data/kernel/data.ay +83 -39
  11. data/kernel/define.ay +84 -93
  12. data/kernel/doc.ay +282 -449
  13. data/kernel/dynamic.ay +25 -29
  14. data/kernel/file.ay +9 -0
  15. data/kernel/grammar.ay +267 -0
  16. data/kernel/hash.ay +17 -0
  17. data/kernel/interpolation.ay +59 -0
  18. data/kernel/io.ay +70 -244
  19. data/kernel/let-macro.ay +24 -0
  20. data/kernel/let-pattern.ay +24 -0
  21. data/kernel/loop.ay +80 -0
  22. data/kernel/mutation.ay +53 -0
  23. data/kernel/particles.ay +176 -39
  24. data/kernel/patterns.ay +527 -191
  25. data/kernel/pretty.ay +311 -277
  26. data/kernel/quotes.ay +29 -0
  27. data/kernel/range.ay +4 -0
  28. data/kernel/regexp.ay +23 -0
  29. data/kernel/repl.ay +83 -109
  30. data/kernel/stack-local.ay +21 -0
  31. data/lib/atomy.rb +37 -0
  32. data/lib/atomy/bootstrap.rb +256 -0
  33. data/lib/atomy/code/assign.rb +64 -0
  34. data/lib/atomy/code/block.rb +98 -0
  35. data/lib/atomy/code/class_variable.rb +17 -0
  36. data/lib/atomy/code/constant.rb +21 -0
  37. data/lib/atomy/code/define.rb +242 -0
  38. data/lib/atomy/code/define_function.rb +51 -0
  39. data/lib/atomy/code/define_method.rb +20 -0
  40. data/lib/atomy/code/false.rb +9 -0
  41. data/lib/atomy/code/instance_variable.rb +15 -0
  42. data/lib/atomy/code/integer.rb +13 -0
  43. data/lib/atomy/code/list.rb +17 -0
  44. data/lib/atomy/code/nil.rb +9 -0
  45. data/lib/atomy/code/pattern.rb +23 -0
  46. data/lib/atomy/code/pattern/and.rb +61 -0
  47. data/lib/atomy/code/pattern/quasi_quote.rb +185 -0
  48. data/lib/atomy/code/pattern/splat.rb +29 -0
  49. data/lib/atomy/code/pattern/wildcard.rb +37 -0
  50. data/lib/atomy/code/quasi_quote.rb +118 -0
  51. data/lib/atomy/code/quote.rb +13 -0
  52. data/lib/atomy/code/self.rb +9 -0
  53. data/lib/atomy/code/send.rb +110 -0
  54. data/lib/atomy/code/sequence.rb +23 -0
  55. data/lib/atomy/code/string_literal.rb +53 -0
  56. data/lib/atomy/code/symbol.rb +13 -0
  57. data/lib/atomy/code/true.rb +9 -0
  58. data/lib/atomy/code/undefined.rb +9 -0
  59. data/lib/atomy/code/variable.rb +17 -0
  60. data/lib/atomy/codeloader.rb +218 -0
  61. data/lib/atomy/compiler.rb +57 -0
  62. data/lib/atomy/errors.rb +54 -0
  63. data/lib/atomy/grammar.rb +2278 -0
  64. data/lib/atomy/locals.rb +75 -0
  65. data/lib/atomy/message_structure.rb +277 -0
  66. data/lib/atomy/method.rb +343 -0
  67. data/lib/atomy/module.rb +144 -0
  68. data/lib/atomy/node/constructable.rb +169 -0
  69. data/lib/atomy/node/equality.rb +113 -0
  70. data/lib/atomy/node/meta.rb +206 -0
  71. data/lib/atomy/node/pretty.rb +108 -0
  72. data/lib/atomy/parser.rb +21 -0
  73. data/lib/atomy/pattern.rb +26 -0
  74. data/lib/atomy/pattern/and.rb +59 -0
  75. data/lib/atomy/pattern/attribute.rb +16 -0
  76. data/lib/atomy/pattern/class_variable.rb +15 -0
  77. data/lib/atomy/pattern/equality.rb +42 -0
  78. data/lib/atomy/pattern/instance_variable.rb +15 -0
  79. data/lib/atomy/pattern/kind_of.rb +20 -0
  80. data/lib/atomy/pattern/or.rb +48 -0
  81. data/lib/atomy/pattern/quasi_quote.rb +164 -0
  82. data/lib/atomy/pattern/splat.rb +15 -0
  83. data/lib/atomy/pattern/wildcard.rb +18 -0
  84. data/lib/atomy/rubygems.rb +48 -0
  85. data/lib/atomy/version.rb +3 -0
  86. metadata +169 -134
  87. data/COPYING +0 -30
  88. data/README.md +0 -1
  89. data/kernel/block.ay +0 -30
  90. data/kernel/boot.ay +0 -10
  91. data/kernel/comparison.ay +0 -61
  92. data/kernel/concurrency.ay +0 -84
  93. data/kernel/cosmetics.ay +0 -3
  94. data/kernel/data-delta.ay +0 -105
  95. data/kernel/documentation.ay +0 -135
  96. data/kernel/errors.ay +0 -6
  97. data/kernel/format.ay +0 -13
  98. data/kernel/format/data.ay +0 -89
  99. data/kernel/format/formatter.ay +0 -345
  100. data/kernel/format/parser.ay +0 -13
  101. data/kernel/hashes.ay +0 -39
  102. data/kernel/namespaces.ay +0 -63
  103. data/kernel/node.ay +0 -48
  104. data/kernel/operators.ay +0 -28
  105. data/kernel/precision.ay +0 -148
  106. data/kernel/therie.ay +0 -204
  107. data/lib/ast/binary_send.rb +0 -44
  108. data/lib/ast/block.rb +0 -268
  109. data/lib/ast/constant.rb +0 -88
  110. data/lib/ast/internal/assign.rb +0 -19
  111. data/lib/ast/internal/block_pass.rb +0 -21
  112. data/lib/ast/internal/catch.rb +0 -247
  113. data/lib/ast/internal/class.rb +0 -30
  114. data/lib/ast/internal/class_variable.rb +0 -23
  115. data/lib/ast/internal/define.rb +0 -174
  116. data/lib/ast/internal/ensure.rb +0 -135
  117. data/lib/ast/internal/file.rb +0 -14
  118. data/lib/ast/internal/global_variable.rb +0 -20
  119. data/lib/ast/internal/if_then_else.rb +0 -24
  120. data/lib/ast/internal/instance_variable.rb +0 -17
  121. data/lib/ast/internal/let_macro.rb +0 -35
  122. data/lib/ast/internal/macro_quote.rb +0 -23
  123. data/lib/ast/internal/match.rb +0 -53
  124. data/lib/ast/internal/module.rb +0 -30
  125. data/lib/ast/internal/pattern.rb +0 -17
  126. data/lib/ast/internal/return.rb +0 -29
  127. data/lib/ast/internal/set.rb +0 -19
  128. data/lib/ast/internal/singleton_class.rb +0 -18
  129. data/lib/ast/internal/splat.rb +0 -14
  130. data/lib/ast/internal/when.rb +0 -24
  131. data/lib/ast/list.rb +0 -25
  132. data/lib/ast/macro.rb +0 -37
  133. data/lib/ast/node.rb +0 -599
  134. data/lib/ast/operator.rb +0 -21
  135. data/lib/ast/particle.rb +0 -13
  136. data/lib/ast/primitive.rb +0 -20
  137. data/lib/ast/quasi_quote.rb +0 -20
  138. data/lib/ast/quote.rb +0 -13
  139. data/lib/ast/send.rb +0 -104
  140. data/lib/ast/splice.rb +0 -32
  141. data/lib/ast/string.rb +0 -23
  142. data/lib/ast/unary.rb +0 -44
  143. data/lib/ast/unquote.rb +0 -45
  144. data/lib/ast/variable.rb +0 -64
  145. data/lib/atomy.kpeg.rb +0 -3995
  146. data/lib/code_loader.rb +0 -137
  147. data/lib/compiler/compiler.rb +0 -155
  148. data/lib/compiler/stages.rb +0 -81
  149. data/lib/formatter.kpeg.rb +0 -1394
  150. data/lib/macros.rb +0 -317
  151. data/lib/method.rb +0 -261
  152. data/lib/namespace.rb +0 -236
  153. data/lib/parser.rb +0 -28
  154. data/lib/patterns.rb +0 -276
  155. data/lib/patterns/any.rb +0 -21
  156. data/lib/patterns/attribute.rb +0 -59
  157. data/lib/patterns/block_pass.rb +0 -54
  158. data/lib/patterns/constant.rb +0 -33
  159. data/lib/patterns/default.rb +0 -44
  160. data/lib/patterns/head_tail.rb +0 -63
  161. data/lib/patterns/list.rb +0 -77
  162. data/lib/patterns/match.rb +0 -45
  163. data/lib/patterns/named.rb +0 -55
  164. data/lib/patterns/named_class.rb +0 -46
  165. data/lib/patterns/named_global.rb +0 -46
  166. data/lib/patterns/named_instance.rb +0 -46
  167. data/lib/patterns/particle.rb +0 -29
  168. data/lib/patterns/quasi_quote.rb +0 -184
  169. data/lib/patterns/quote.rb +0 -33
  170. data/lib/patterns/singleton_class.rb +0 -31
  171. data/lib/patterns/splat.rb +0 -57
  172. data/lib/util.rb +0 -37
@@ -1,222 +1,227 @@
1
- dynamic(labels, Hash new)
1
+ use(require("core"))
2
+ use(require("define"))
2
3
 
3
- macro(if(x) then(&y) else(&z)):
4
- Atomy::AST::IfThenElse new(line, x, y body, z body)
4
+ and = class:
5
+ def(initialize(a, b)):
6
+ instance-variable-set("@a", a)
7
+ instance-variable-set("@b", b)
5
8
 
6
- macro(otherwise): 'true
9
+ def(bytecode(gen, mod)):
10
+ done = gen new-label
7
11
 
8
- macro(condition(&bs)):
9
- bs contents reverse inject('nil) [acc, `(~x -> ~y)]:
10
- `(if(~x) then: ~y; else: ~acc)
12
+ mod compile(gen, @a)
13
+ gen dup
14
+ gen gif(done)
11
15
 
12
- macro(return(y)):
13
- Atomy::AST::Return new(line, y)
16
+ gen pop
17
+ mod compile(gen, @b)
14
18
 
15
- macro(x rescue(&y)):
16
- Atomy::AST::Catch new(line, x caller, y contents)
19
+ done set!
17
20
 
18
- macro(x rescue(&y) else(&z)):
19
- Atomy::AST::Catch new(line, x caller, y contents, z body)
21
+ macro(~a && ~b):
22
+ and new(a, b)
20
23
 
21
- macro(x ensuring(&y)):
22
- Atomy::AST::Ensure new(line, x caller, y body)
24
+ or = class:
25
+ def(initialize(a, b)):
26
+ instance-variable-set("@a", a)
27
+ instance-variable-set("@b", b)
23
28
 
24
- macro(when(c, &b)):
25
- Atomy::AST::When new(line, c, b body)
29
+ def(bytecode(gen, mod)):
30
+ done = gen new-label
26
31
 
27
- macro(unless(c, &b)):
28
- Atomy::AST::When new(line, `!~c, b body)
32
+ mod compile(gen, @a)
33
+ gen dup
34
+ gen git(done)
29
35
 
30
- macro(super):
31
- Atomy::AST::ZSuper new(line)
36
+ gen pop
37
+ mod compile(gen, @b)
32
38
 
33
- macro(super(*args, &blk)):
34
- Atomy::AST::Super new(line, args, blk)
39
+ done set!
35
40
 
36
- macro(yield):
37
- Atomy::AST::Yield new(line, [])
41
+ macro(~a || ~b):
42
+ or new(a, b)
38
43
 
39
- macro(yield(*args)):
40
- Atomy::AST::Yield new(line, args)
44
+ if-then-else = class:
45
+ def(initialize(if, then, else)):
46
+ instance-variable-set("@if", if)
47
+ instance-variable-set("@then", then)
48
+ instance-variable-set("@else", else)
41
49
 
42
- macro(break):
43
- Atomy::AST::Break new(line, 'nil)
50
+ def(bytecode(gen, mod)):
51
+ else = gen new-label
52
+ done = gen new-label
44
53
 
45
- macro(break(x)):
46
- Atomy::AST::Break new(line, x)
54
+ mod compile(gen, @if)
55
+ gen gif(else)
47
56
 
48
- macro(next):
49
- Atomy::AST::Next new(line, 'nil)
57
+ mod compile(gen, @then)
58
+ gen goto(done)
50
59
 
51
- macro(next(x)):
52
- Atomy::AST::Next new(line, x)
60
+ else set!
61
+ mod compile(gen, @else)
53
62
 
54
- module(Atomy::AST):
55
- class(Labels < Node):
56
- children([#tags])
57
- generate
63
+ done set!
58
64
 
59
- bytecode(g) := do:
60
- pos(g)
65
+ macro(if(~x) then: ~*y; else: ~*z):
66
+ if-then-else new(x, `(do: ~*y), `(do: ~*z))
61
67
 
62
- tags = ::Hash new
68
+ macro(when(~x): ~*y):
69
+ `(if(~x) then: ~*y; else: nil)
63
70
 
64
- labels =
65
- @tags collect [t]:
66
- tags [t method-name] = g new-label
71
+ macro(unless(~x): ~*y):
72
+ `(if(~x) then: nil; else: ~*y)
67
73
 
68
- let(labels = tags):
69
- labels zip(@tags) each [[l, t]]:
70
- l set!
71
- t block body bytecode(g)
72
- g pop
74
+ negate = class:
75
+ def(initialize(node)):
76
+ instance-variable-set("@node", node)
73
77
 
74
- g push-nil
78
+ def(bytecode(gen, mod)):
79
+ done = gen new-label
80
+ yes = gen new-label
75
81
 
76
- class(GoTo < Node):
77
- attributes(#name)
78
- generate
82
+ mod compile(gen, @node)
83
+ gen git(yes)
79
84
 
80
- bytecode(g) := do:
81
- pos(g)
82
- g goto(^labels fetch(@name))
85
+ gen push-true
86
+ gen goto(done)
83
87
 
84
- class(ZSuper < Node):
85
- generate
88
+ yes set!
89
+ gen push-false
86
90
 
87
- bytecode(g) := do:
88
- pos(g)
91
+ done set!
89
92
 
90
- g push-block
93
+ macro(!~node):
94
+ negate new(node)
91
95
 
92
- if(g state super?)
93
- then:
94
- g zsuper(g state super name)
95
- else:
96
- g zsuper(nil)
96
+ return-class = class:
97
+ def(initialize(node)):
98
+ instance-variable-set("@node", node)
99
+
100
+ def(bytecode(gen, mod)):
101
+ mod compile(gen, @node)
102
+ gen ret
103
+
104
+ macro(return): return-class new('nil)
105
+ macro(return(~node)): return-class new(node)
106
+
107
+ ensure = class:
108
+ def(initialize(node, ensured)):
109
+ instance-variable-set("@node", node)
110
+ instance-variable-set("@ensured", ensured)
97
111
 
98
- class(Super < Node):
99
- children([#arguments], #block?)
100
- generate
101
-
102
- bytecode(g) := do:
103
- pos(g)
104
-
105
- block = @block
106
- splat = nil
107
-
108
- args = 0
109
- @arguments each [a]:
110
- e = a prepare
111
- e match:
112
- BlockPass -> do:
113
- block =! e
114
- -- break
115
-
116
- Splat -> do:
117
- splat =! e
118
- -- break
119
-
120
- _ -> do:
121
- e bytecode(g)
122
- args += 1
123
-
124
- when(splat):
125
- splat compile(g)
126
- g cast-array
127
-
128
- if(block)
129
- then: block compile(g)
130
- else: g push-nil
131
-
132
- g send-super(nil, args, splat)
133
-
134
- class(Yield < Node):
135
- children([#arguments])
136
- generate
137
-
138
- bytecode(g) := do:
139
- pos(g)
140
-
141
- splat = nil
142
-
143
- args = 0
144
- @arguments each [a]:
145
- e = a prepare
146
- e match:
147
- Splat -> do:
148
- splat =! e
149
- -- break
150
-
151
- _ -> do:
152
- e bytecode(g)
153
- args += 1
154
-
155
- if(splat)
156
- then:
157
- splat compile(g)
158
- g cast-array
159
- g yield-splat(args)
160
- else:
161
- g yield-stack(args)
162
-
163
- class(Break < Node):
164
- children(#value)
165
- generate
166
-
167
- bytecode(g) := do:
168
- pos(g)
169
- @value compile(g)
170
- g raise-break
171
-
172
- class(Next < Node):
173
- children(#value)
174
- generate
175
-
176
- bytecode(g) := do:
177
- pos(g)
178
- @value compile(g)
179
- g ret
180
-
181
- macro(labels(&body)):
182
- `(let-macro(go(name) = Atomy::AST::GoTo new(line, name name)):
183
- ~(Atomy::AST::Labels new(line, body contents)))
184
-
185
- macro(while(test, &body)):
186
- names [loop, done]:
187
- `(let-macro(break = 'go(~done),
188
- next = 'go(~loop)):
189
- labels:
190
- ~loop:
191
- unless(~test):
192
- go(~done)
193
-
194
- ~(body caller)
195
- go(~loop)
196
-
197
- ~done {})
198
-
199
- macro(until(test, &body)):
200
- names [loop, done]:
201
- `(let-macro(break = 'go(~done),
202
- next = 'go(~loop)):
203
- labels:
204
- ~loop:
205
- when(~test):
206
- go(~done)
207
-
208
- ~(body caller)
209
- go(~loop)
210
-
211
- ~done {})
212
-
213
- macro(loop(&body)):
214
- names [loop, done]:
215
- `(let-macro(break = 'go(~done),
216
- next = 'go(~loop)):
217
- labels:
218
- ~loop:
219
- ~(body caller)
220
- go(~loop)
221
-
222
- ~done {})
112
+ -- TODO: this is pretty barebones compared to:
113
+ -- https://github.com/rubinius/rubinius-ast/blob/aa5ff6260a7647a9ef1035feb66b6d4b632d4211/lib/rubinius/ast/exceptions.rb
114
+ -- i'd rather prove out the complexity than blindly mirror it
115
+ def(bytecode(gen, mod)):
116
+ ok = gen new-label
117
+ ex = gen new-label
118
+
119
+ gen setup-unwind(ex, 1) -- EnsureType
120
+
121
+ mod compile(gen, @node)
122
+
123
+ gen pop-unwind
124
+ gen goto(ok)
125
+
126
+ ex set!
127
+ gen push-exception-state
128
+ mod compile(gen, @ensured)
129
+ gen pop
130
+ gen restore-exception-state
131
+ gen reraise
132
+
133
+ ok set!
134
+ mod compile(gen, @ensured)
135
+ gen pop
136
+
137
+ macro(~node ensuring: ~*ensured):
138
+ ensure new(node, `(do: ~*ensured))
139
+
140
+ macro(~(x & Word) ||= ~y): `(&~x = (~x || ~y))
141
+ macro(~(x & Word) &&= ~y): `(&~x = (~x && ~y))
142
+
143
+ macro(~x ||= ~y): `(~x = (~x || ~y))
144
+ macro(~x &&= ~y): `(~x = (~x && ~y))
145
+
146
+ super-code = class:
147
+ def(initialize(form)):
148
+ structure = Atomy MessageStructure new(form)
149
+ instance-variable-set("@arguments", structure arguments)
150
+ instance-variable-set("@splat_argument", structure splat-argument)
151
+ instance-variable-set("@proc_argument", structure proc-argument)
152
+ instance-variable-set("@block", structure block)
153
+
154
+ def(bytecode(gen, mod)):
155
+ @arguments each [a]:
156
+ mod compile(gen, a)
157
+
158
+ when(@splat-argument):
159
+ mod compile(gen, @splat-argument)
160
+ gen cast-array
161
+
162
+ if(@block)
163
+ then:
164
+ mod compile(
165
+ gen
166
+ Atomy Code Block new(
167
+ `(do: ~*(@block body))
168
+ @block arguments
169
+ nil
170
+ false
171
+ )
172
+ )
173
+ else:
174
+ if(@proc-argument)
175
+ then: push-proc-argument(gen, mod)
176
+ else: gen push-nil
177
+
178
+ gen send-super(nil, @arguments size, !!@splat-argument)
179
+
180
+ def(push-proc-argument(gen, mod)):
181
+ nil-proc-arg = gen new-label
182
+ mod compile(gen, @proc-argument)
183
+ gen dup
184
+ gen is-nil
185
+ gen git(nil_proc_arg)
186
+ gen push-cpath-top
187
+ gen find-const(.Proc)
188
+ gen swap
189
+ gen send(.__from_block__, 1)
190
+ nil-proc-arg set!
191
+
192
+ macro(super): super-code new('super)
193
+ macro(super(~*args)): super-code new(`super(~*args))
194
+ macro(super &~blk): super-code new(`(super &~blk))
195
+ macro(super: ~*blk): super-code new(`(super: ~*blk))
196
+ macro(super [~*bargs]: ~*blk): super-code new(`(super [~*bargs]: ~*blk))
197
+ macro(super(~*args) &~blk): super-code new(`(super(~*args) &~blk))
198
+ macro(super(~*args): ~*blk): super-code new(`(super(~*args): ~*blk))
199
+ macro(super(~*args) [~*bargs]: ~*blk): super-code new(`(super(~*args) [~*bargs]: ~*blk))
200
+
201
+ break-class = class:
202
+ def(initialize(value)):
203
+ instance-variable-set("@value", value)
204
+
205
+ def(bytecode(gen, mod)):
206
+ mod compile(gen, @value)
207
+ gen raise-break
208
+
209
+ macro(break): break-class new('nil)
210
+ macro(break(~value)): break-class new(value)
211
+
212
+ next-class = class:
213
+ def(initialize(value)):
214
+ instance-variable-set("@value", value)
215
+
216
+ def(bytecode(gen, mod)):
217
+ mod compile(gen, @value)
218
+ gen ret
219
+
220
+ macro(next): next-class new('nil)
221
+ macro(next(~value)): next-class new(value)
222
+
223
+ macro(condition: ~*branches):
224
+ branches reverse inject('nil) [else, `(~cond: ~*branch)]:
225
+ if(cond == 'otherwise)
226
+ then: `(do: ~*branch)
227
+ else: `(if(~cond) then: ~*branch; else: ~else)
data/kernel/core.ay ADDED
@@ -0,0 +1,120 @@
1
+ -- a macro for defining macros!
2
+ evaluate(macro-definer(
3
+ '`(macro(~pat): ~*body)
4
+ 'macro-definer(make-quasiquote(pat), make-sequence(body))))
5
+
6
+ -- pattern definition
7
+ macro(pattern(~pat): ~*body):
8
+ pattern-definer(make-quasiquote(pat), make-sequence(body))
9
+
10
+ -- sequences
11
+ macro(do: ~*nodes):
12
+ make-sequence(nodes)
13
+
14
+ -- constant scoping
15
+ macro(~parent ~(name & Constant)):
16
+ make-constant(name text, parent)
17
+
18
+ -- booleans
19
+ macro(false): Atomy Code False new
20
+ macro(true): Atomy Code True new
21
+
22
+ -- nils
23
+ macro(nil): Atomy Code Nil new
24
+
25
+ -- undefined
26
+ macro(_): Atomy Code Undefined new
27
+
28
+ -- symbols
29
+ macro(.~(sym & Word)): Atomy Code Symbol new(sym text)
30
+ macro(.(~(sym & Word))!): Atomy Code Symbol new((sym text to-s + "!") to-sym)
31
+ macro(.(~(sym & Word))?): Atomy Code Symbol new((sym text to-s + "?") to-sym)
32
+ macro(.~(sym & Constant)): Atomy Code Symbol new(sym text)
33
+ macro(.~(str & StringLiteral)): Atomy Code Symbol new(str value to-sym)
34
+ macro(.[]): Atomy Code Symbol new("[]" to-sym)
35
+ macro(.[]=): Atomy Code Symbol new("[]=" to-sym)
36
+
37
+ -- assignment
38
+ macro(~pat = ~val):
39
+ Atomy Code Assign new(pat, val)
40
+
41
+ -- block literals
42
+ macro({ ~*body }):
43
+ Atomy Code Block new(`(do: ~*body))
44
+
45
+ macro([~*args]: ~*body):
46
+ Atomy Code Block new(`(do: ~*body), args)
47
+
48
+ macro(&~blk { ~*body }):
49
+ Atomy Code Block new(`(do: ~*body), [], blk)
50
+
51
+ macro([~*args] &~blk { ~*body }):
52
+ Atomy Code Block new(`(do: ~*body), args, blk)
53
+
54
+ -- toplevel constant access
55
+ macro(//~(name & Constant)):
56
+ Atomy Code Constant new(name text, 'Object)
57
+
58
+ -- accessing instance variables
59
+ macro(@~(name & Word)):
60
+ Atomy Code InstanceVariable new(name text)
61
+
62
+ macro(@(~(name & Word))!):
63
+ Atomy Code InstanceVariable new((name text to-s + "!") to-sym)
64
+
65
+ macro(@(~(name & Word))?):
66
+ Atomy Code InstanceVariable new((name text to-s + "?") to-sym)
67
+
68
+ -- accessing class variables
69
+ macro(@@~(name & Word)):
70
+ Atomy Code ClassVariable new(name text)
71
+
72
+ macro(@@(~(name & Word))!):
73
+ Atomy Code ClassVariable new((name text to-s + "!") to-sym)
74
+
75
+ macro(@@(~(name & Word))?):
76
+ Atomy Code ClassVariable new((name text to-s + "?") to-sym)
77
+
78
+ -- accessing global variables
79
+ macro($~(name & Word)):
80
+ `(//Rubinius Globals[~(Atomy Code Symbol new(("$" + name text to-s) to-sym))])
81
+
82
+ macro($(~(name & Word))?):
83
+ `(//Rubinius Globals[~(Atomy Code Symbol new(("$" + (name text to-s + "?")) to-sym))])
84
+
85
+ macro($(~(name & Word))!):
86
+ `(//Rubinius Globals[~(Atomy Code Symbol new(("$" + (name text to-s + "!")) to-sym))])
87
+
88
+ macro($~(name & Constant)):
89
+ `(//Rubinius Globals[~(Atomy Code Symbol new(("$" + name text to-s) to-sym))])
90
+
91
+ macro($~(name & StringLiteral)):
92
+ `(//Rubinius Globals[~(Atomy Code Symbol new(("$" + name value to-s) to-sym))])
93
+
94
+ -- foo! access/sending
95
+ macro((~(msg & Word))!):
96
+ Atomy Code Variable new((msg text to-s + "!") to-sym)
97
+
98
+ -- foo? access/sending
99
+ macro((~(msg & Word))?):
100
+ Atomy Code Variable new((msg text to-s + "?") to-sym)
101
+
102
+ -- pattern for assigning foo!
103
+ pattern((~(name & Word))!):
104
+ Atomy Code Pattern Wildcard new((name text to-s + "!") to-sym)
105
+
106
+ -- pattern for assigning foo?
107
+ pattern((~(name & Word))?):
108
+ Atomy Code Pattern Wildcard new((name text to-s + "?") to-sym)
109
+
110
+ -- pattern for re-assigning existing local
111
+ pattern(&(~(name & Word))):
112
+ Atomy Code Pattern Wildcard new(name text, true)
113
+
114
+ -- pattern for re-assigning existing local ending in !
115
+ pattern(&(~(name & Word))!):
116
+ Atomy Code Pattern Wildcard new((name text to-s + "!") to-sym, true)
117
+
118
+ -- pattern for re-assigning existing local ending in ?
119
+ pattern(&(~(name & Word))?):
120
+ Atomy Code Pattern Wildcard new((name text to-s + "?") to-sym, true)