fancy 0.3.3 → 0.4.0

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 (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
  }