fancy 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/README.md +1 -0
  2. data/bin/fspec +3 -1
  3. data/boot/code_loader.rb +5 -1
  4. data/boot/compiler/parser/ext/fancy_parser.bundle +0 -0
  5. data/boot/fancy_ext.rb +2 -0
  6. data/boot/fancy_ext/bootstrap.rb +6 -0
  7. data/boot/fancy_ext/symbol.rb +9 -0
  8. data/boot/fancy_ext/thread.rb +22 -1
  9. data/boot/load.rb +1 -0
  10. data/boot/rbx-compiler/parser/Makefile +156 -0
  11. data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
  12. data/boot/rbx-compiler/parser/lexer.c +2310 -0
  13. data/boot/rbx-compiler/parser/lexer.h +315 -0
  14. data/boot/rbx-compiler/parser/parser.c +2946 -0
  15. data/boot/rbx-compiler/parser/parser.h +151 -0
  16. data/doc/api/fancy.jsonp +1 -1
  17. data/doc/features.md +8 -0
  18. data/examples/actors.fy +5 -9
  19. data/examples/actors_primitive.fy +4 -3
  20. data/examples/actors_ring.fy +15 -14
  21. data/examples/dynamic.fy +8 -0
  22. data/examples/dynamic_output.fy +15 -0
  23. data/examples/parsing.fy +1 -0
  24. data/examples/person.fy +1 -2
  25. data/lib/array.fy +49 -11
  26. data/lib/block.fy +18 -24
  27. data/lib/boot.fy +1 -1
  28. data/lib/class.fy +6 -6
  29. data/lib/compiler/ast.fy +0 -1
  30. data/lib/compiler/ast/assign.fy +25 -0
  31. data/lib/compiler/ast/block.fy +1 -0
  32. data/lib/compiler/ast/identifier.fy +16 -0
  33. data/lib/compiler/ast/literals.fy +4 -0
  34. data/lib/compiler/ast/message_send.fy +16 -1
  35. data/lib/enumerable.fy +45 -18
  36. data/lib/enumerator.fy +15 -15
  37. data/lib/false_class.fy +8 -0
  38. data/lib/fancy_spec.fy +20 -20
  39. data/lib/future.fy +35 -18
  40. data/lib/hash.fy +2 -2
  41. data/lib/integer.fy +1 -17
  42. data/lib/iteration.fy +36 -36
  43. data/lib/object.fy +65 -30
  44. data/lib/package.fy +2 -2
  45. data/lib/package/installer.fy +6 -0
  46. data/lib/parser/ext/Makefile +156 -0
  47. data/lib/parser/ext/fancy_parser.bundle +0 -0
  48. data/lib/parser/ext/lexer.c +2392 -0
  49. data/lib/parser/ext/lexer.h +315 -0
  50. data/lib/parser/ext/lexer.lex +0 -10
  51. data/lib/parser/ext/parser.c +3251 -0
  52. data/lib/parser/ext/parser.h +161 -0
  53. data/lib/parser/ext/parser.y +0 -22
  54. data/lib/parser/methods.fy +1 -13
  55. data/lib/range.fy +3 -3
  56. data/lib/rbx.fy +1 -0
  57. data/lib/rbx/actor.fy +4 -4
  58. data/lib/rbx/alpha.fy +6 -0
  59. data/lib/rbx/array.fy +5 -44
  60. data/lib/rbx/bignum.fy +1 -12
  61. data/lib/rbx/block.fy +25 -0
  62. data/lib/rbx/class.fy +1 -7
  63. data/lib/rbx/date.fy +1 -5
  64. data/lib/rbx/file.fy +1 -4
  65. data/lib/rbx/fixnum.fy +4 -16
  66. data/lib/rbx/float.fy +1 -10
  67. data/lib/rbx/integer.fy +14 -2
  68. data/lib/rbx/io.fy +1 -5
  69. data/lib/rbx/mutex.fy +30 -0
  70. data/lib/rbx/object.fy +5 -11
  71. data/lib/rbx/process.fy +13 -0
  72. data/lib/rbx/range.fy +1 -5
  73. data/lib/rbx/string.fy +4 -11
  74. data/lib/rbx/thread.fy +9 -0
  75. data/lib/rbx/time.fy +1 -7
  76. data/lib/stack.fy +1 -1
  77. data/lib/string.fy +9 -9
  78. data/lib/symbol.fy +12 -7
  79. data/lib/tuple.fy +18 -3
  80. data/lib/vars.fy +3 -0
  81. data/ruby_lib/fspec +2 -2
  82. data/ruby_lib/fyi +2 -2
  83. data/ruby_lib/ifancy +2 -2
  84. data/tests/array.fy +25 -1
  85. data/tests/assignment.fy +55 -0
  86. data/tests/future.fy +28 -0
  87. data/tests/set.fy +20 -0
  88. data/tests/stack.fy +46 -0
  89. data/tests/string.fy +1 -1
  90. data/tests/tuple.fy +22 -0
  91. data/tools/fancy-mode.el +1 -1
  92. metadata +26 -8
  93. data/lib/compiler/ast/goto.fy +0 -46
  94. data/lib/message.fy +0 -6
@@ -0,0 +1,161 @@
1
+ /* A Bison parser, made by GNU Bison 2.3. */
2
+
3
+ /* Skeleton interface for Bison's Yacc-like parsers in C
4
+
5
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
6
+ Free Software Foundation, Inc.
7
+
8
+ This program is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 2, or (at your option)
11
+ any later version.
12
+
13
+ This program is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with this program; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
21
+ Boston, MA 02110-1301, USA. */
22
+
23
+ /* As a special exception, you may create a larger work that contains
24
+ part or all of the Bison parser skeleton and distribute that work
25
+ under terms of your choice, so long as that work isn't itself a
26
+ parser generator using the skeleton or a modified version thereof
27
+ as a parser skeleton. Alternatively, if you modify or redistribute
28
+ the parser skeleton itself, you may (at your option) remove this
29
+ special exception, which will cause the skeleton and the resulting
30
+ Bison output files to be licensed under the GNU General Public
31
+ License without this special exception.
32
+
33
+ This special exception was added by the Free Software Foundation in
34
+ version 2.2 of Bison. */
35
+
36
+ /* Tokens. */
37
+ #ifndef YYTOKENTYPE
38
+ # define YYTOKENTYPE
39
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
40
+ know about them. */
41
+ enum yytokentype {
42
+ LPAREN = 258,
43
+ RPAREN = 259,
44
+ FUTURE_SEND = 260,
45
+ ASYNC_SEND = 261,
46
+ AT_LCURLY = 262,
47
+ LCURLY = 263,
48
+ RCURLY = 264,
49
+ LBRACKET = 265,
50
+ RBRACKET = 266,
51
+ LEFTHASH = 267,
52
+ RIGHTHASH = 268,
53
+ STAB = 269,
54
+ ARROW = 270,
55
+ THIN_ARROW = 271,
56
+ COMMA = 272,
57
+ SEMI = 273,
58
+ NL = 274,
59
+ COLON = 275,
60
+ RETURN_LOCAL = 276,
61
+ RETURN = 277,
62
+ TRY = 278,
63
+ CATCH = 279,
64
+ FINALLY = 280,
65
+ RETRY = 281,
66
+ SUPER = 282,
67
+ CLASS = 283,
68
+ DEF = 284,
69
+ DOT = 285,
70
+ DOLLAR = 286,
71
+ EQUALS = 287,
72
+ MATCH = 288,
73
+ CASE = 289,
74
+ IDENTIFIER = 290,
75
+ SELECTOR = 291,
76
+ RUBY_SEND_OPEN = 292,
77
+ RUBY_OPER_OPEN = 293,
78
+ CONSTANT = 294,
79
+ INTEGER_LITERAL = 295,
80
+ HEX_LITERAL = 296,
81
+ OCT_LITERAL = 297,
82
+ BIN_LITERAL = 298,
83
+ DOUBLE_LITERAL = 299,
84
+ STRING_LITERAL = 300,
85
+ MULTI_STRING_LITERAL = 301,
86
+ SYMBOL_LITERAL = 302,
87
+ REGEX_LITERAL = 303,
88
+ OPERATOR = 304,
89
+ BACKTICK_LITERAL = 305
90
+ };
91
+ #endif
92
+ /* Tokens. */
93
+ #define LPAREN 258
94
+ #define RPAREN 259
95
+ #define FUTURE_SEND 260
96
+ #define ASYNC_SEND 261
97
+ #define AT_LCURLY 262
98
+ #define LCURLY 263
99
+ #define RCURLY 264
100
+ #define LBRACKET 265
101
+ #define RBRACKET 266
102
+ #define LEFTHASH 267
103
+ #define RIGHTHASH 268
104
+ #define STAB 269
105
+ #define ARROW 270
106
+ #define THIN_ARROW 271
107
+ #define COMMA 272
108
+ #define SEMI 273
109
+ #define NL 274
110
+ #define COLON 275
111
+ #define RETURN_LOCAL 276
112
+ #define RETURN 277
113
+ #define TRY 278
114
+ #define CATCH 279
115
+ #define FINALLY 280
116
+ #define RETRY 281
117
+ #define SUPER 282
118
+ #define CLASS 283
119
+ #define DEF 284
120
+ #define DOT 285
121
+ #define DOLLAR 286
122
+ #define EQUALS 287
123
+ #define MATCH 288
124
+ #define CASE 289
125
+ #define IDENTIFIER 290
126
+ #define SELECTOR 291
127
+ #define RUBY_SEND_OPEN 292
128
+ #define RUBY_OPER_OPEN 293
129
+ #define CONSTANT 294
130
+ #define INTEGER_LITERAL 295
131
+ #define HEX_LITERAL 296
132
+ #define OCT_LITERAL 297
133
+ #define BIN_LITERAL 298
134
+ #define DOUBLE_LITERAL 299
135
+ #define STRING_LITERAL 300
136
+ #define MULTI_STRING_LITERAL 301
137
+ #define SYMBOL_LITERAL 302
138
+ #define REGEX_LITERAL 303
139
+ #define OPERATOR 304
140
+ #define BACKTICK_LITERAL 305
141
+
142
+
143
+
144
+
145
+ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
146
+ typedef union YYSTYPE
147
+ #line 18 "/Users/backtype/projects/fancy/lib/parser/ext/parser.y"
148
+ {
149
+ VALUE object;
150
+ ID symbol;
151
+ }
152
+ /* Line 1529 of yacc.c. */
153
+ #line 154 "/Users/backtype/projects/fancy/lib/parser/ext/parser.h"
154
+ YYSTYPE;
155
+ # define yystype YYSTYPE /* obsolescent; will be withdrawn */
156
+ # define YYSTYPE_IS_DECLARED 1
157
+ # define YYSTYPE_IS_TRIVIAL 1
158
+ #endif
159
+
160
+ extern YYSTYPE yylval;
161
+
@@ -55,8 +55,6 @@ extern char *yytext;
55
55
  %token MATCH
56
56
  %token CASE
57
57
  %token IDENTIFIER
58
- %token GOTO
59
- %token LABEL
60
58
  %token SELECTOR
61
59
  %token RUBY_SEND_OPEN
62
60
  %token RUBY_OPER_OPEN
@@ -90,9 +88,6 @@ extern char *yytext;
90
88
 
91
89
 
92
90
  %type <object> identifier
93
- %type <object> goto_statement
94
- %type <object> label_literal
95
- %type <object> label_statement
96
91
  %type <object> any_identifier
97
92
  %type <object> constant
98
93
  %type <object> literal_value
@@ -219,23 +214,6 @@ partial_expression_block: AT_LCURLY space expression_list space RCURLY {
219
214
  statement: assignment
220
215
  | return_local_statement
221
216
  | return_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
- }
239
217
  ;
240
218
 
241
219
  primary: any_identifier
@@ -337,20 +337,8 @@ class Fancy {
337
337
  AST RubyArgs new: line args: args block: block
338
338
  }
339
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
-
352
340
  def ast: line parse_error: text {
353
- ParseError new: line message: text filename: @filename . raise!
341
+ ParseError new: (line - 1) message: text filename: @filename . raise!
354
342
  }
355
343
 
356
344
  def ast: line file_error: text {
data/lib/range.fy CHANGED
@@ -3,9 +3,9 @@ class Range {
3
3
  Class of Range values. Are created by using Range literal syntax in Fancy.
4
4
 
5
5
  Example:
6
- (10..100) # Range from 10 to 100
7
- # the following code does the same as above:
8
- Range new: 10 to: 100
6
+ (10..100) # Range from 10 to 100
7
+ # the following code does the same as above:
8
+ Range new: 10 to: 100
9
9
  """
10
10
 
11
11
  include: FancyEnumerable
data/lib/rbx.fy CHANGED
@@ -39,3 +39,4 @@ require: "rbx/fiber"
39
39
  require: "rbx/date"
40
40
  require: "rbx/time"
41
41
  require: "rbx/actor"
42
+ require: "rbx/mutex"
data/lib/rbx/actor.fy CHANGED
@@ -41,11 +41,11 @@ class Actor {
41
41
 
42
42
  Example usage:
43
43
 
44
- Actor spawn: {
45
- loop: {
46
- Actor receive println # print all incoming messages
44
+ Actor spawn: {
45
+ loop: {
46
+ Actor receive println # print all incoming messages
47
+ }
47
48
  }
48
- }
49
49
  """
50
50
 
51
51
  Actor spawn(&block)
data/lib/rbx/alpha.fy CHANGED
@@ -24,6 +24,12 @@ class Class {
24
24
  def ruby_alias: method_name {
25
25
  alias_method(":" + (method_name to_s), method_name)
26
26
  }
27
+
28
+ def ruby_aliases: method_names {
29
+ method_names each() |m| {
30
+ ruby_alias: m
31
+ }
32
+ }
27
33
  }
28
34
 
29
35
  class String {
data/lib/rbx/array.fy CHANGED
@@ -1,9 +1,5 @@
1
1
  class Array {
2
- ruby_alias: '==
3
- ruby_alias: '<<
4
- ruby_alias: 'pop
5
- ruby_alias: 'last
6
- ruby_alias: 'shift
2
+ ruby_aliases: [ '==, '<<, 'pop, 'last, 'shift ]
7
3
 
8
4
  forwards_unary_ruby_methods
9
5
 
@@ -61,6 +57,8 @@ class Array {
61
57
  at(idx)
62
58
  }
63
59
 
60
+ alias_method('at_put, '[]=)
61
+
64
62
  def [idx]: obj {
65
63
  """
66
64
  @idx Index to set a value for.
@@ -69,7 +67,8 @@ class Array {
69
67
 
70
68
  Inserts a given object at a given index (position) in the Array.
71
69
  """
72
- ruby: '[]= args: [idx, obj]
70
+
71
+ at_put(idx, obj)
73
72
  }
74
73
 
75
74
  alias_method: 'at:put: for: '[]:
@@ -94,44 +93,6 @@ class Array {
94
93
  last(count)
95
94
  }
96
95
 
97
- def any?: block {
98
- """
99
- @block Predicate @Block@ to be called for each element until it returns @true for any one of them.
100
- @return @true if any element in @self yields @true for @block, @false otherwise.
101
-
102
- Takes condition-block and returns @true if any element meets it.
103
- """
104
- any?(&block)
105
- }
106
-
107
- def all?: block {
108
- """
109
- @block Predicate @Block@ to be called for each element until it returns @false for any one of them.
110
- @return @true if all elements in @self yield @true for @block, @false otherwise.
111
-
112
- Takes condition-block and returns @true if all elements meet it.
113
- """
114
- all?(&block)
115
- }
116
-
117
- def reject: block {
118
- """
119
- Returns a new Array with all the elements which yield nil or false
120
- when called with the given Block.
121
- """
122
-
123
- reject(&block)
124
- }
125
-
126
- def reject!: block {
127
- """
128
- Same as Array#reject: but doing so in-place (destructive).
129
- """
130
-
131
- reject!(&block)
132
- return self
133
- }
134
-
135
96
  def join: join_str {
136
97
  """
137
98
  @join_str @String@ by which to @join all elements in @self into a new @String@.
data/lib/rbx/bignum.fy CHANGED
@@ -5,18 +5,7 @@ class Bignum {
5
5
 
6
6
  include: Number
7
7
 
8
- ruby_alias: '==
9
- ruby_alias: '-
10
- ruby_alias: '+
11
- ruby_alias: '*
12
- ruby_alias: '/
13
- ruby_alias: '<
14
- ruby_alias: '>
15
- ruby_alias: '<=
16
- ruby_alias: '>=
17
- ruby_alias: '===
18
- ruby_alias: '**
19
- ruby_alias: '&
8
+ ruby_aliases: [ '==, '-, '+, '*, '/, '<, '>, '<=, '>=, '===, '**, '& ]
20
9
 
21
10
  forwards_unary_ruby_methods
22
11
 
data/lib/rbx/block.fy CHANGED
@@ -4,6 +4,31 @@ class Block {
4
4
  forwards_unary_ruby_methods
5
5
  metaclass forwards_unary_ruby_methods
6
6
 
7
+ # low level while_true: implementation
8
+ # use direct bytecode generation for speed purposes
9
+ # this gives us good speed in loops
10
+ dynamic_method('while_true_impl:) |g| {
11
+ start = g new_label()
12
+ end = g new_label()
13
+ g total_args=(1)
14
+
15
+ start set!()
16
+ g push_self()
17
+ g send('call, 0)
18
+ g set_local(1)
19
+ g gif(end)
20
+ g push_local(0)
21
+ g push_local(1)
22
+ g send('call, 1)
23
+ g pop()
24
+ g check_interrupts()
25
+ g goto(start)
26
+
27
+ end set!()
28
+ g push_nil()
29
+ g ret()
30
+ }
31
+
7
32
  def receiver {
8
33
  """
9
34
  @return Receiver object of a @Block@.
data/lib/rbx/class.fy CHANGED
@@ -1,11 +1,5 @@
1
1
  class Class {
2
- ruby_alias: 'superclass
3
- ruby_alias: '===
4
- ruby_alias: 'ancestors
5
- ruby_alias: 'instance_methods
6
- ruby_alias: 'methods
7
- ruby_alias: 'inspect
8
- ruby_alias: 'to_s
2
+ ruby_aliases: [ 'superclass, '===, 'ancestors, 'instance_methods, 'methods, 'inspect, 'to_s ]
9
3
 
10
4
  def new {
11
5
  """
data/lib/rbx/date.fy CHANGED
@@ -9,11 +9,7 @@ class Date {
9
9
  metaclass forwards_unary_ruby_methods
10
10
 
11
11
  metaclass ruby_alias: 'today
12
- ruby_alias: '==
13
- ruby_alias: '-
14
- ruby_alias: '+
15
- ruby_alias: '<
16
- ruby_alias: '>
12
+ ruby_aliases: [ '==, '-, '+, '<, '> ]
17
13
 
18
14
  def != other {
19
15
  self == other not
data/lib/rbx/file.fy CHANGED
@@ -7,10 +7,7 @@ class File {
7
7
  'binary => "b",
8
8
  'truncate => "w+"]>
9
9
 
10
- ruby_alias: 'eof?
11
- #ruby_alias: 'close
12
- ruby_alias: 'closed?
13
- ruby_alias: 'flush
10
+ ruby_aliases: [ 'eof?, 'closed?, 'flush ]
14
11
 
15
12
  def File open: filename modes: modes_arr with: block {
16
13
  """