fancy 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. data/README.md +14 -14
  2. data/Rakefile +16 -4
  3. data/bin/fancy +3 -0
  4. data/bin/fspec +20 -0
  5. data/bin/fyi +27 -11
  6. data/bin/ifancy +1 -1
  7. data/boot/fancy_ext.rb +1 -0
  8. data/boot/fancy_ext/block_env.rb +1 -9
  9. data/boot/fancy_ext/delegator.rb +64 -0
  10. data/boot/fancy_ext/object.rb +4 -0
  11. data/boot/fancy_ext/thread.rb +4 -0
  12. data/boot/load.rb +5 -1
  13. data/boot/rbx-compiler/compiler/ast.rb +0 -1
  14. data/boot/rbx-compiler/compiler/ast/class_def.rb +2 -0
  15. data/boot/rbx-compiler/compiler/ast/method_def.rb +2 -0
  16. data/boot/rbx-compiler/compiler/ast/node.rb +10 -0
  17. data/boot/rbx-compiler/compiler/ast/ruby_args.rb +12 -0
  18. data/boot/rbx-compiler/compiler/ast/singleton_method_def.rb +2 -0
  19. data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
  20. data/boot/rbx-compiler/parser/lexer.lex +5 -11
  21. data/boot/rbx-compiler/parser/parser.rb +16 -5
  22. data/boot/rbx-compiler/parser/parser.y +39 -24
  23. data/doc/api/fancy.css +1 -1
  24. data/doc/api/fancy.jsonp +1 -1
  25. data/doc/api/fdoc.js +22 -4
  26. data/doc/api/index.html +5 -6
  27. data/doc/api/jquery-ui.min.js +401 -0
  28. data/doc/api/jquery.tools.min.js +192 -0
  29. data/doc/api/themeswitchertool.js +250 -0
  30. data/doc/features.md +17 -0
  31. data/examples/actor_bunnies.fy +32 -0
  32. data/examples/actors.fy +26 -0
  33. data/examples/actors_primitive.fy +27 -0
  34. data/examples/actors_ring.fy +37 -0
  35. data/examples/armstrong_numbers.fy +1 -1
  36. data/examples/array.fy +7 -9
  37. data/examples/async_send.fy +1 -2
  38. data/examples/blocks.fy +4 -4
  39. data/examples/call_with_receiver.fy +1 -1
  40. data/examples/class.fy +1 -1
  41. data/examples/default_args.fy +4 -1
  42. data/examples/define_methods.fy +2 -2
  43. data/examples/echo.fy +1 -1
  44. data/examples/factorial.fy +1 -1
  45. data/examples/future_composition.fy +2 -2
  46. data/examples/futures.fy +0 -5
  47. data/examples/game_of_life.fy +1 -1
  48. data/examples/person.fy +1 -1
  49. data/lib/argv.fy +7 -2
  50. data/lib/array.fy +109 -42
  51. data/lib/block.fy +39 -14
  52. data/lib/boot.fy +2 -0
  53. data/lib/class.fy +2 -0
  54. data/lib/compiler/ast.fy +2 -1
  55. data/lib/compiler/ast/assign.fy +2 -3
  56. data/lib/compiler/ast/async_send.fy +1 -15
  57. data/lib/compiler/ast/class_def.fy +2 -1
  58. data/lib/compiler/ast/expression_list.fy +4 -5
  59. data/lib/compiler/ast/future_send.fy +1 -10
  60. data/lib/compiler/ast/goto.fy +46 -0
  61. data/lib/compiler/ast/identifier.fy +9 -7
  62. data/lib/compiler/ast/literals.fy +8 -1
  63. data/lib/compiler/ast/match.fy +14 -4
  64. data/lib/compiler/ast/message_send.fy +34 -6
  65. data/lib/compiler/ast/method_def.fy +6 -6
  66. data/lib/compiler/ast/node.fy +3 -3
  67. data/lib/compiler/ast/range.fy +1 -0
  68. data/lib/compiler/ast/script.fy +0 -2
  69. data/lib/compiler/ast/singleton_method_def.fy +2 -4
  70. data/lib/compiler/ast/string_interpolation.fy +17 -0
  71. data/lib/compiler/ast/super.fy +5 -4
  72. data/lib/compiler/ast/try_catch.fy +8 -6
  73. data/lib/compiler/ast/tuple_literal.fy +3 -2
  74. data/lib/compiler/command.fy +0 -1
  75. data/lib/compiler/compiler.fy +1 -5
  76. data/lib/compiler/stages.fy +6 -14
  77. data/lib/documentation.fy +57 -46
  78. data/lib/enumerable.fy +257 -23
  79. data/lib/enumerator.fy +122 -15
  80. data/lib/false_class.fy +10 -1
  81. data/lib/fancy_spec.fy +263 -61
  82. data/lib/fdoc.fy +11 -25
  83. data/lib/fiber.fy +11 -0
  84. data/lib/file.fy +8 -11
  85. data/lib/future.fy +84 -5
  86. data/lib/hash.fy +65 -14
  87. data/lib/integer.fy +35 -0
  88. data/lib/iteration.fy +54 -29
  89. data/lib/message.fy +6 -0
  90. data/lib/method.fy +0 -16
  91. data/lib/nil_class.fy +58 -8
  92. data/lib/number.fy +49 -22
  93. data/lib/object.fy +371 -65
  94. data/lib/package.fy +24 -1
  95. data/lib/package/installer.fy +5 -9
  96. data/lib/package/specification.fy +2 -2
  97. data/lib/parser/ext/lexer.lex +15 -11
  98. data/lib/parser/ext/parser.y +70 -23
  99. data/lib/parser/methods.fy +33 -14
  100. data/lib/proxy.fy +33 -3
  101. data/lib/range.fy +28 -0
  102. data/lib/rbx.fy +3 -1
  103. data/lib/rbx/actor.fy +53 -0
  104. data/lib/rbx/alpha.fy +31 -0
  105. data/lib/rbx/array.fy +21 -12
  106. data/lib/rbx/bignum.fy +6 -2
  107. data/lib/rbx/block.fy +23 -26
  108. data/lib/rbx/class.fy +54 -2
  109. data/lib/rbx/code_loader.fy +8 -4
  110. data/lib/rbx/date.fy +9 -0
  111. data/lib/rbx/directory.fy +18 -0
  112. data/lib/rbx/environment_variables.fy +1 -0
  113. data/lib/rbx/exception.fy +9 -2
  114. data/lib/rbx/fiber.fy +22 -4
  115. data/lib/rbx/file.fy +5 -5
  116. data/lib/rbx/fixnum.fy +5 -0
  117. data/lib/rbx/float.fy +11 -3
  118. data/lib/rbx/hash.fy +31 -16
  119. data/lib/rbx/integer.fy +1 -0
  120. data/lib/rbx/io.fy +17 -7
  121. data/lib/rbx/match_data.fy +15 -4
  122. data/lib/rbx/method.fy +40 -7
  123. data/lib/rbx/name_error.fy +4 -0
  124. data/lib/rbx/object.fy +92 -24
  125. data/lib/rbx/range.fy +20 -6
  126. data/lib/rbx/regexp.fy +11 -3
  127. data/lib/rbx/string.fy +51 -1
  128. data/lib/rbx/stringio.fy +17 -0
  129. data/lib/rbx/symbol.fy +15 -1
  130. data/lib/rbx/system.fy +20 -2
  131. data/lib/rbx/tcp_server.fy +4 -1
  132. data/lib/rbx/tcp_socket.fy +11 -0
  133. data/lib/rbx/time.fy +6 -0
  134. data/lib/rbx/tuple.fy +14 -5
  135. data/lib/set.fy +144 -29
  136. data/lib/stack.fy +42 -11
  137. data/lib/string.fy +118 -8
  138. data/lib/struct.fy +13 -3
  139. data/lib/symbol.fy +21 -2
  140. data/lib/thread_pool.fy +2 -1
  141. data/lib/true_class.fy +45 -7
  142. data/lib/tuple.fy +27 -9
  143. data/lib/version.fy +2 -2
  144. data/ruby_lib/fancy +43 -0
  145. data/ruby_lib/fdoc +23 -0
  146. data/ruby_lib/fspec +3 -0
  147. data/ruby_lib/fyi +3 -0
  148. data/ruby_lib/ifancy +3 -0
  149. data/tests/argv.fy +5 -9
  150. data/tests/array.fy +323 -196
  151. data/tests/assignment.fy +29 -29
  152. data/tests/block.fy +72 -59
  153. data/tests/class.fy +227 -138
  154. data/tests/control_flow.fy +83 -51
  155. data/tests/documentation.fy +8 -8
  156. data/tests/enumerable.fy +8 -0
  157. data/tests/enumerator.fy +47 -29
  158. data/tests/exception.fy +49 -32
  159. data/tests/file.fy +28 -28
  160. data/tests/fixnum.fy +170 -0
  161. data/tests/future.fy +24 -7
  162. data/tests/hash.fy +55 -38
  163. data/tests/method.fy +50 -43
  164. data/tests/nil_class.fy +37 -37
  165. data/tests/object.fy +152 -70
  166. data/tests/pattern_matching.fy +67 -31
  167. data/tests/range.fy +6 -6
  168. data/tests/set.fy +101 -4
  169. data/tests/stack.fy +14 -5
  170. data/tests/string.fy +115 -61
  171. data/tests/stringio.fy +18 -0
  172. data/tests/struct.fy +27 -0
  173. data/tests/symbol.fy +19 -6
  174. data/tests/true_class.fy +34 -34
  175. data/tests/tuple.fy +30 -12
  176. metadata +103 -81
  177. data/boot/rbx-compiler/compiler/ast/require.rb +0 -20
  178. data/examples/actor.fy +0 -37
  179. data/examples/curl_async.fy +0 -37
  180. data/lib/compiler/ast/require.fy +0 -15
  181. data/tests/number.fy +0 -135
  182. data/tests/parsing/sexp.fy +0 -50
@@ -25,9 +25,14 @@ class Fancy Package {
25
25
  """
26
26
 
27
27
  ENV_PACKAGE_DIR_VAR = "FANCY_PACKAGE_DIR"
28
+ DEFAULT_FANCY_ROOT = ENV["HOME"] ++ "/.fancy"
29
+ DEFAULT_PACKAGES_PATH = DEFAULT_FANCY_ROOT ++ "/packages"
30
+ DEFAULT_PACKAGES_LIB_PATH = DEFAULT_PACKAGES_PATH ++ "/lib"
28
31
 
29
32
  def self install: package_name {
30
33
  """
34
+ @package_name Name of package to install.
35
+
31
36
  Installs a package with a given name.
32
37
  Expects package_name to be a string in the form of:
33
38
  user/repo
@@ -38,22 +43,40 @@ class Fancy Package {
38
43
  }
39
44
 
40
45
  def self uninstall: package_name {
46
+ """
47
+ @package_name Name of package to uninstall.
48
+
49
+ Uninstalls a package with a given name (if installed).
50
+ """
51
+
41
52
  Uninstaller new: package_name . run
42
53
  }
43
54
 
44
55
  def self list_packages {
56
+ """
57
+ Lists (prints) all installed packages on this system.
58
+ """
59
+
45
60
  Fancy Package List new: package_list_file . println
46
61
  }
47
62
 
48
63
  def self root_dir {
64
+ """
65
+ @return Fancy Package root install dir.
66
+ """
67
+
49
68
  if: (ENV[ENV_PACKAGE_DIR_VAR]) then: |path| {
50
69
  return path
51
70
  } else: {
52
- return Fancy Package Installer DEFAULT_PACKAGES_PATH
71
+ return DEFAULT_PACKAGES_PATH
53
72
  }
54
73
  }
55
74
 
56
75
  def self package_list_file {
76
+ """
77
+ @return Path to installed_packages.txt @File@ on system.
78
+ """
79
+
57
80
  "#{self root_dir}/installed_packages.txt"
58
81
  }
59
82
 
@@ -13,10 +13,6 @@ class Fancy Package {
13
13
 
14
14
  """
15
15
 
16
- DEFAULT_FANCY_ROOT = ENV["HOME"] ++ "/.fancy"
17
- DEFAULT_PACKAGES_PATH = DEFAULT_FANCY_ROOT ++ "/packages"
18
- DEFAULT_PACKAGES_LIB_PATH = DEFAULT_PACKAGES_PATH ++ "/lib"
19
-
20
16
  def initialize: @package_name version: @version ("latest") install_path: @install_path (ENV["FANCY_PACKAGE_DIR"]) {
21
17
  """
22
18
  Creates a new @Package Installer@ for a given package name, an
@@ -37,11 +33,11 @@ class Fancy Package {
37
33
  }
38
34
 
39
35
  @install_path if_nil: {
40
- @install_path = DEFAULT_PACKAGES_PATH
41
- Directory create!: DEFAULT_FANCY_ROOT
42
- Directory create!: DEFAULT_PACKAGES_PATH
43
- Directory create!: DEFAULT_PACKAGES_LIB_PATH
44
- Directory create!: $ DEFAULT_PACKAGES_PATH ++ "/downloads"
36
+ @install_path = Fancy Package DEFAULT_PACKAGES_PATH
37
+ Directory create!: $ Fancy Package DEFAULT_FANCY_ROOT
38
+ Directory create!: $ Fancy Package DEFAULT_PACKAGES_PATH
39
+ Directory create!: $ Fancy Package DEFAULT_PACKAGES_LIB_PATH
40
+ Directory create!: $ Fancy Package DEFAULT_PACKAGES_PATH ++ "/downloads"
45
41
  }
46
42
 
47
43
  @download_path = @install_path ++ "/downloads"
@@ -15,7 +15,7 @@ class Fancy Package {
15
15
 
16
16
  block call_with_receiver: self
17
17
 
18
- @@specs at: @package_name put: self
18
+ @@specs[@package_name]: self
19
19
  }
20
20
 
21
21
  def dependencies: dependencies {
@@ -52,7 +52,7 @@ class Fancy Package {
52
52
  "name=#{@package_name} version=#{@version} url=https://github.com/#{@gh_user}/#{@package_name}"
53
53
  }
54
54
 
55
- def self [] package_name {
55
+ def self [package_name] {
56
56
  @@specs[package_name]
57
57
  }
58
58
 
@@ -16,7 +16,7 @@ lower [a-z]
16
16
  letter [A-Za-z]
17
17
  special [-+?!=*/^><%&~]
18
18
  special_under ({special}|"_")
19
- operator ({special}+|"||"{special_under}*)
19
+ operator ({special}+|" | "|"||"{special_under}*)
20
20
  int_lit [-+]?{digit}({digit}|_{digit})*
21
21
  double_lit {int_lit}\.{digit}+
22
22
  hex_lit 0[xX]{hexdigit}+
@@ -42,23 +42,22 @@ thin_arrow "->"
42
42
  delimiter [ \n\r\t\(\)]
43
43
  return_local "return_local"
44
44
  return "return"
45
- require "require:"
46
45
  try "try"
47
46
  catch "catch"
48
47
  finally "finally"
49
48
  retry "retry"
50
49
  super "super"
51
- private "private"
52
- protected "protected"
53
50
  self "self"
54
51
  match "match"
55
52
  case "case"
56
53
  identifier @?@?({lower}|[_&*])({letter}|{digit}|{special_under})*
54
+ label @{identifier}@
55
+ goto_ "goto"
57
56
  selector ({letter}|[_&*])({letter}|{digit}|{special_under})*":"
58
57
  constant {capital}({letter}|{digit}|{special_under})*
59
58
  nested_constant ({constant}::)+{constant}
60
- symbol_lit \'({identifier}|{operator}|{constant}|:|"[]")+
61
- ruby_send_open {identifier}{lparen}
59
+ symbol_lit \'({identifier}|{operator}|{constant}|:|"[]"|"|")+
60
+ ruby_send_open ({constant}|{identifier}){lparen}
62
61
  ruby_oper_open {operator}{lparen}
63
62
  regexp_lit "/".*"/"
64
63
  comma ,
@@ -118,8 +117,8 @@ escaped_newline "\\".*\n
118
117
  {rcurly} { return RCURLY; }
119
118
  {lbracket} { return LBRACKET; }
120
119
  {rbracket} { return RBRACKET; }
121
- {lhash} { return LHASH; }
122
- {rhash} { return RHASH; }
120
+ {lhash} { return LEFTHASH; }
121
+ {rhash} { return RIGHTHASH; }
123
122
  {stab} { return STAB; }
124
123
  {arrow} { return ARROW; }
125
124
  {thin_arrow} { return THIN_ARROW; }
@@ -130,14 +129,11 @@ escaped_newline "\\".*\n
130
129
  }
131
130
  {return_local} { return RETURN_LOCAL; }
132
131
  {return} { return RETURN; }
133
- {require} { return REQUIRE; }
134
132
  {try} { return TRY; }
135
133
  {catch} { return CATCH; }
136
134
  {finally} { return FINALLY; }
137
135
  {retry} { return RETRY; }
138
136
  {super} { return SUPER; }
139
- {private} { return PRIVATE; }
140
- {protected} { return PROTECTED; }
141
137
  {self} {
142
138
  yylval.object = rb_str_new2(yytext);
143
139
  return IDENTIFIER;
@@ -148,6 +144,14 @@ escaped_newline "\\".*\n
148
144
  {case} {
149
145
  return CASE;
150
146
  }
147
+ {goto_} {
148
+ yylval.object = rb_str_new2(yytext);
149
+ return GOTO;
150
+ }
151
+ {label} {
152
+ yylval.object = rb_str_new2(yytext);
153
+ return LABEL;
154
+ }
151
155
  {identifier} {
152
156
  yylval.object = rb_str_new2(yytext);
153
157
  return IDENTIFIER;
@@ -31,8 +31,8 @@ extern char *yytext;
31
31
  %token RCURLY
32
32
  %token LBRACKET
33
33
  %token RBRACKET
34
- %token LHASH
35
- %token RHASH
34
+ %token LEFTHASH
35
+ %token RIGHTHASH
36
36
  %token STAB
37
37
  %token ARROW
38
38
  %token THIN_ARROW
@@ -42,14 +42,11 @@ extern char *yytext;
42
42
  %token COLON
43
43
  %token RETURN_LOCAL
44
44
  %token RETURN
45
- %token REQUIRE
46
45
  %token TRY
47
46
  %token CATCH
48
47
  %token FINALLY
49
48
  %token RETRY
50
49
  %token SUPER
51
- %token PRIVATE
52
- %token PROTECTED
53
50
  %token CLASS
54
51
  %token DEF
55
52
  %token DOT
@@ -58,6 +55,8 @@ extern char *yytext;
58
55
  %token MATCH
59
56
  %token CASE
60
57
  %token IDENTIFIER
58
+ %token GOTO
59
+ %token LABEL
61
60
  %token SELECTOR
62
61
  %token RUBY_SEND_OPEN
63
62
  %token RUBY_OPER_OPEN
@@ -91,6 +90,9 @@ extern char *yytext;
91
90
 
92
91
 
93
92
  %type <object> identifier
93
+ %type <object> goto_statement
94
+ %type <object> label_literal
95
+ %type <object> label_statement
94
96
  %type <object> any_identifier
95
97
  %type <object> constant
96
98
  %type <object> literal_value
@@ -118,7 +120,6 @@ extern char *yytext;
118
120
  %type <object> identifier_list
119
121
  %type <object> return_local_statement
120
122
  %type <object> return_statement
121
- %type <object> require_statement
122
123
 
123
124
  %type <object> def
124
125
 
@@ -209,6 +210,7 @@ expression_block: LCURLY space expression_list space RCURLY {
209
210
  }
210
211
  ;
211
212
 
213
+
212
214
  partial_expression_block: AT_LCURLY space expression_list space RCURLY {
213
215
  $$ = $3;
214
216
  }
@@ -217,7 +219,23 @@ partial_expression_block: AT_LCURLY space expression_list space RCURLY {
217
219
  statement: assignment
218
220
  | return_local_statement
219
221
  | return_statement
220
- | require_statement
222
+ | label_statement
223
+ | goto_statement
224
+ ;
225
+
226
+ label_literal: LABEL {
227
+ $$ = fy_terminal_node(self, "ast:string_value:");
228
+ }
229
+ ;
230
+
231
+ label_statement: label_literal {
232
+ $$ = rb_funcall(self, rb_intern("ast:label:"), 2, INT2NUM(yylineno), $1);
233
+ }
234
+ ;
235
+
236
+ goto_statement: GOTO label_literal {
237
+ $$ = rb_funcall(self, rb_intern("ast:goto:"), 2, INT2NUM(yylineno), $2);
238
+ }
221
239
  ;
222
240
 
223
241
  primary: any_identifier
@@ -265,7 +283,8 @@ constant: CONSTANT {
265
283
 
266
284
  selector: SELECTOR {
267
285
  $$ = fy_terminal_node(self, "ast:identifier:");
268
- };
286
+ }
287
+ ;
269
288
 
270
289
  identifier: IDENTIFIER {
271
290
  $$ = fy_terminal_node(self, "ast:identifier:");
@@ -306,12 +325,6 @@ return_statement: RETURN exp {
306
325
  }
307
326
  ;
308
327
 
309
- require_statement: REQUIRE string_literal {
310
- $$ = rb_funcall(self, rb_intern("ast:require_:"), 2, INT2NUM(yylineno), $2);
311
- }
312
- | REQUIRE any_identifier {
313
- $$ = rb_funcall(self, rb_intern("ast:require_:"), 2, INT2NUM(yylineno), $2);
314
- }
315
328
  ;
316
329
 
317
330
  class_def: class_no_super
@@ -326,19 +339,23 @@ const_identifier: constant {
326
339
  }
327
340
  ;
328
341
 
329
- def: DEF PRIVATE { $$ = rb_intern("private"); }
330
- | DEF PROTECTED { $$ = rb_intern("protected"); }
331
- | DEF { $$ = rb_intern("public"); }
342
+ def: DEF { $$ = rb_intern("public"); }
332
343
  ;
333
344
 
334
345
  class_no_super: CLASS const_identifier expression_block {
335
346
  $$ = rb_funcall(self, rb_intern("ast:class:parent:body:"), 4, INT2NUM(yylineno), $2, Qnil, $3);
336
347
  }
348
+ | CLASS const_identifier {
349
+ $$ = rb_funcall(self, rb_intern("ast:class:parent:"), 3, INT2NUM(yylineno), $2, Qnil);
350
+ }
337
351
  ;
338
352
 
339
353
  class_super: CLASS const_identifier COLON const_identifier expression_block {
340
354
  $$ = rb_funcall(self, rb_intern("ast:class:parent:body:"), 4, INT2NUM(yylineno), $2, $4, $5);
341
355
  }
356
+ | CLASS const_identifier COLON const_identifier {
357
+ $$ = rb_funcall(self, rb_intern("ast:class:parent:"), 3, INT2NUM(yylineno), $2, $4);
358
+ }
342
359
  ;
343
360
 
344
361
  method_def: method_w_args
@@ -384,40 +401,60 @@ method_args_default: method_arg_default {
384
401
  method_w_args: def method_args expression_block {
385
402
  $$ = rb_funcall(self, rb_intern("ast:method:expand:access:"), 4, INT2NUM(yylineno), $2, $3, $1);
386
403
  }
404
+ | def method_args {
405
+ $$ = rb_funcall(self, rb_intern("ast:method:expand:access:"), 4, INT2NUM(yylineno), $2, Qnil, $1);
406
+ }
387
407
  ;
388
408
 
389
409
 
390
410
  method_no_args: def identifier expression_block {
391
411
  $$ = rb_funcall(self, rb_intern("ast:method:body:access:"), 4, INT2NUM(yylineno), $2, $3, $1);
392
412
  }
413
+ | def identifier {
414
+ $$ = rb_funcall(self, rb_intern("ast:method:body:access:"), 4, INT2NUM(yylineno), $2, Qnil, $1);
415
+ }
393
416
  ;
394
417
 
395
418
 
396
419
  class_method_w_args: def any_identifier method_args expression_block {
397
420
  $$ = rb_funcall(self, rb_intern("ast:method:expand:access:owner:"), 5, INT2NUM(yylineno), $3, $4, $1, $2);
398
421
  }
422
+ | def any_identifier method_args {
423
+ $$ = rb_funcall(self, rb_intern("ast:method:expand:access:owner:"), 5, INT2NUM(yylineno), $3, Qnil, $1, $2);
424
+ }
399
425
  ;
400
426
 
401
427
  class_method_no_args: def any_identifier identifier expression_block {
402
428
  $$ = rb_funcall(self, rb_intern("ast:method:body:access:owner:"), 5, INT2NUM(yylineno), $3, $4, $1, $2);
403
429
  }
430
+ | def any_identifier identifier {
431
+ $$ = rb_funcall(self, rb_intern("ast:method:body:access:owner:"), 5, INT2NUM(yylineno), $3, Qnil, $1, $2);
432
+ }
404
433
  ;
405
434
 
406
435
  operator_def: def operator identifier expression_block {
407
436
  $$ = rb_funcall(self, rb_intern("ast:oper:arg:body:access:"), 5, INT2NUM(yylineno), $2, $3, $4, $1);
408
437
  }
409
- | def LBRACKET RBRACKET identifier expression_block {
438
+ | def LBRACKET identifier RBRACKET expression_block {
410
439
  $$ = rb_funcall(self, rb_intern("ast:oper:arg:body:access:"), 5,
411
- INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]"), $4, $5, $1);
440
+ INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]"), $3, $5, $1);
441
+ }
442
+ | def LBRACKET identifier RBRACKET COLON identifier expression_block {
443
+ $$ = rb_funcall(self, rb_intern("ast:oper:arg:arg:body:access:"), 6,
444
+ INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]:"), $3, $6, $7, $1);
412
445
  }
413
446
  ;
414
447
 
415
448
  class_operator_def: def any_identifier operator identifier expression_block {
416
449
  $$ = rb_funcall(self, rb_intern("ast:oper:arg:body:access:owner:"), 6, INT2NUM(yylineno), $3, $4, $5, $1, $2);
417
450
  }
418
- | def any_identifier LBRACKET RBRACKET identifier expression_block {
451
+ | def any_identifier LBRACKET identifier RBRACKET expression_block {
419
452
  $$ = rb_funcall(self, rb_intern("ast:oper:arg:body:access:owner:"), 6,
420
- INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]"), $5, $6, $1, $2);
453
+ INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]"), $4, $6, $1, $2);
454
+ }
455
+ | def any_identifier LBRACKET identifier RBRACKET COLON identifier expression_block {
456
+ $$ = rb_funcall(self, rb_intern("ast:oper:arg:arg:body:access:owner:"), 7,
457
+ INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]:"), $4, $7, $8, $1, $2);
421
458
  }
422
459
  ;
423
460
 
@@ -451,6 +488,10 @@ operator_send: exp operator arg_exp {
451
488
  $$ = rb_funcall(self, rb_intern("ast:oper:arg:to:"), 4,
452
489
  INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]"), $3, $1);
453
490
  }
491
+ | exp LBRACKET exp RBRACKET COLON arg_exp {
492
+ $$ = rb_funcall(self, rb_intern("ast:oper:arg:arg:to:"), 5,
493
+ INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]:"), $3, $6, $1);
494
+ }
454
495
  | operator arg_exp {
455
496
  $$ = rb_funcall(self, rb_intern("ast:oper:arg:"), 3, INT2NUM(yylineno), $1, $2);
456
497
  }
@@ -484,6 +525,12 @@ message_send: unary_send
484
525
  | send_args {
485
526
  $$ = rb_funcall(self, rb_intern("ast:send:"), 2, INT2NUM(yylineno), $1);
486
527
  }
528
+ | unary_send FUTURE_SEND send_args {
529
+ $$ = rb_funcall(self, rb_intern("ast:future_send:to:"), 3, INT2NUM(yylineno), $3, $1);
530
+ }
531
+ | unary_send ASYNC_SEND send_args {
532
+ $$ = rb_funcall(self, rb_intern("ast:async_send:to:"), 3, INT2NUM(yylineno), $3, $1);
533
+ }
487
534
  | exp FUTURE_SEND send_args {
488
535
  $$ = rb_funcall(self, rb_intern("ast:future_send:to:"), 3, INT2NUM(yylineno), $3, $1);
489
536
  }
@@ -698,10 +745,10 @@ empty_array: LBRACKET space RBRACKET {
698
745
  }
699
746
  ;
700
747
 
701
- hash_literal: LHASH space key_value_list space RHASH {
748
+ hash_literal: LEFTHASH space key_value_list space RIGHTHASH {
702
749
  $$ = rb_funcall(self, rb_intern("ast:hash:"), 2, INT2NUM(yylineno), $3);
703
750
  }
704
- | LHASH space RHASH {
751
+ | LEFTHASH space RIGHTHASH {
705
752
  $$ = rb_funcall(self, rb_intern("ast:hash:"), 2, INT2NUM(yylineno), Qnil);
706
753
  }
707
754
  ;
@@ -74,20 +74,19 @@ class Fancy {
74
74
  interpol_str = matches[2]
75
75
  suffix = matches[3]
76
76
 
77
- binding = AST MessageSend new: line message: (ast: line identifier: "binding") to: (AST Self new: line) args: (AST RubyArgs new: line args: [])
78
- evalstr = AST StringLiteral new: line value: interpol_str
79
- msg = ast: line identifier: "eval:binding:"
80
- binding_send = AST MessageSend new: line message: msg to: (ast: line identifier: "Fancy") \
81
- args: (AST MessageArgs new: line args: [evalstr, binding])
82
-
83
77
  prefix_str = ast: line string: (" " + prefix + " ") # hack, pre- & append " " since it gets removed
84
78
  suffix_str = ast: line string: (" " + suffix + " ")
79
+ interpol_ast = AST StringInterpolation new: line code: interpol_str
85
80
  # create messagesend to concatenate:
86
81
  concat_ident = ast: line identifier: "++"
87
- concat_prefix_send = AST MessageSend new: line message: concat_ident to: prefix_str args: (AST MessageArgs new: line args: [binding_send])
88
- concat_suffix_send = AST MessageSend new: line message: concat_ident to: concat_prefix_send args: (AST MessageArgs new: line args: [suffix_str])
82
+ interpol_send = AST MessageSend new: line message: concat_ident to: prefix_str args: (AST MessageArgs new: line args: [interpol_ast])
83
+
84
+ # don't concatenate suffix if it's empty..
85
+ unless: (suffix == "") do: {
86
+ interpol_send = AST MessageSend new: line message: concat_ident to: interpol_send args: (AST MessageArgs new: line args: [suffix_str])
87
+ }
89
88
 
90
- concat_suffix_send # this shall get returned, yo
89
+ interpol_send # this shall get returned, yo
91
90
  case _ ->
92
91
  AST StringLiteral new: line value: str
93
92
  }
@@ -164,6 +163,13 @@ class Fancy {
164
163
  ast: line send: message to: receiver
165
164
  }
166
165
 
166
+ def ast: line oper: oper arg: arg1 arg: arg2 to: receiver (AST Self new: line) {
167
+ m1 = SelectorValue new(oper, arg1)
168
+ m2 = SelectorValue new(ast: line identifier: "", arg2)
169
+ message = [m1, m2]
170
+ ast: line send: message to: receiver
171
+ }
172
+
167
173
  def ast: line future_oper: oper arg: arg to: receiver {
168
174
  oper_send = ast: line oper: oper arg: arg to: receiver
169
175
  AST FutureSend new: line message_send: oper_send
@@ -248,6 +254,11 @@ class Fancy {
248
254
  ast: line method: margs body: body access: access owner: owner
249
255
  }
250
256
 
257
+ def ast: line oper: op arg: arg1 arg: arg2 body: body access: access ('public) owner: owner (nil) {
258
+ margs = [SelectorVarDefault new(op, arg1, nil), SelectorVarDefault new(ast: line identifier: "", arg2, nil)]
259
+ ast: line method: margs body: body access: access owner: owner
260
+ }
261
+
251
262
  def ast: line method: margs body: body access: access ('public) owner: owner (nil) {
252
263
  if: (margs is_a?(AST Identifier)) then: {
253
264
  args = AST MethodArgs new: line args: []
@@ -296,11 +307,7 @@ class Fancy {
296
307
  AST BlockLiteral new: line args: args body: body
297
308
  }
298
309
 
299
- def ast: line require_: file {
300
- AST Require new: line file: file
301
- }
302
-
303
- def ast: line class: name parent: parent body: body {
310
+ def ast: line class: name parent: parent body: body (AST ExpressionList new: line) {
304
311
  AST ClassDef new: line name: name parent: parent body: body
305
312
  }
306
313
 
@@ -330,6 +337,18 @@ class Fancy {
330
337
  AST RubyArgs new: line args: args block: block
331
338
  }
332
339
 
340
+ def ast: line string_value: string {
341
+ string
342
+ }
343
+
344
+ def ast: line goto: label_name {
345
+ AST Goto new: line label_name: label_name
346
+ }
347
+
348
+ def ast: line label: label {
349
+ AST Label new: line name: label
350
+ }
351
+
333
352
  def ast: line parse_error: text {
334
353
  ParseError new: line message: text filename: @filename . raise!
335
354
  }