fancy 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +14 -14
- data/Rakefile +16 -4
- data/bin/fancy +3 -0
- data/bin/fspec +20 -0
- data/bin/fyi +27 -11
- data/bin/ifancy +1 -1
- data/boot/fancy_ext.rb +1 -0
- data/boot/fancy_ext/block_env.rb +1 -9
- data/boot/fancy_ext/delegator.rb +64 -0
- data/boot/fancy_ext/object.rb +4 -0
- data/boot/fancy_ext/thread.rb +4 -0
- data/boot/load.rb +5 -1
- data/boot/rbx-compiler/compiler/ast.rb +0 -1
- data/boot/rbx-compiler/compiler/ast/class_def.rb +2 -0
- data/boot/rbx-compiler/compiler/ast/method_def.rb +2 -0
- data/boot/rbx-compiler/compiler/ast/node.rb +10 -0
- data/boot/rbx-compiler/compiler/ast/ruby_args.rb +12 -0
- data/boot/rbx-compiler/compiler/ast/singleton_method_def.rb +2 -0
- data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
- data/boot/rbx-compiler/parser/lexer.lex +5 -11
- data/boot/rbx-compiler/parser/parser.rb +16 -5
- data/boot/rbx-compiler/parser/parser.y +39 -24
- data/doc/api/fancy.css +1 -1
- data/doc/api/fancy.jsonp +1 -1
- data/doc/api/fdoc.js +22 -4
- data/doc/api/index.html +5 -6
- data/doc/api/jquery-ui.min.js +401 -0
- data/doc/api/jquery.tools.min.js +192 -0
- data/doc/api/themeswitchertool.js +250 -0
- data/doc/features.md +17 -0
- data/examples/actor_bunnies.fy +32 -0
- data/examples/actors.fy +26 -0
- data/examples/actors_primitive.fy +27 -0
- data/examples/actors_ring.fy +37 -0
- data/examples/armstrong_numbers.fy +1 -1
- data/examples/array.fy +7 -9
- data/examples/async_send.fy +1 -2
- data/examples/blocks.fy +4 -4
- data/examples/call_with_receiver.fy +1 -1
- data/examples/class.fy +1 -1
- data/examples/default_args.fy +4 -1
- data/examples/define_methods.fy +2 -2
- data/examples/echo.fy +1 -1
- data/examples/factorial.fy +1 -1
- data/examples/future_composition.fy +2 -2
- data/examples/futures.fy +0 -5
- data/examples/game_of_life.fy +1 -1
- data/examples/person.fy +1 -1
- data/lib/argv.fy +7 -2
- data/lib/array.fy +109 -42
- data/lib/block.fy +39 -14
- data/lib/boot.fy +2 -0
- data/lib/class.fy +2 -0
- data/lib/compiler/ast.fy +2 -1
- data/lib/compiler/ast/assign.fy +2 -3
- data/lib/compiler/ast/async_send.fy +1 -15
- data/lib/compiler/ast/class_def.fy +2 -1
- data/lib/compiler/ast/expression_list.fy +4 -5
- data/lib/compiler/ast/future_send.fy +1 -10
- data/lib/compiler/ast/goto.fy +46 -0
- data/lib/compiler/ast/identifier.fy +9 -7
- data/lib/compiler/ast/literals.fy +8 -1
- data/lib/compiler/ast/match.fy +14 -4
- data/lib/compiler/ast/message_send.fy +34 -6
- data/lib/compiler/ast/method_def.fy +6 -6
- data/lib/compiler/ast/node.fy +3 -3
- data/lib/compiler/ast/range.fy +1 -0
- data/lib/compiler/ast/script.fy +0 -2
- data/lib/compiler/ast/singleton_method_def.fy +2 -4
- data/lib/compiler/ast/string_interpolation.fy +17 -0
- data/lib/compiler/ast/super.fy +5 -4
- data/lib/compiler/ast/try_catch.fy +8 -6
- data/lib/compiler/ast/tuple_literal.fy +3 -2
- data/lib/compiler/command.fy +0 -1
- data/lib/compiler/compiler.fy +1 -5
- data/lib/compiler/stages.fy +6 -14
- data/lib/documentation.fy +57 -46
- data/lib/enumerable.fy +257 -23
- data/lib/enumerator.fy +122 -15
- data/lib/false_class.fy +10 -1
- data/lib/fancy_spec.fy +263 -61
- data/lib/fdoc.fy +11 -25
- data/lib/fiber.fy +11 -0
- data/lib/file.fy +8 -11
- data/lib/future.fy +84 -5
- data/lib/hash.fy +65 -14
- data/lib/integer.fy +35 -0
- data/lib/iteration.fy +54 -29
- data/lib/message.fy +6 -0
- data/lib/method.fy +0 -16
- data/lib/nil_class.fy +58 -8
- data/lib/number.fy +49 -22
- data/lib/object.fy +371 -65
- data/lib/package.fy +24 -1
- data/lib/package/installer.fy +5 -9
- data/lib/package/specification.fy +2 -2
- data/lib/parser/ext/lexer.lex +15 -11
- data/lib/parser/ext/parser.y +70 -23
- data/lib/parser/methods.fy +33 -14
- data/lib/proxy.fy +33 -3
- data/lib/range.fy +28 -0
- data/lib/rbx.fy +3 -1
- data/lib/rbx/actor.fy +53 -0
- data/lib/rbx/alpha.fy +31 -0
- data/lib/rbx/array.fy +21 -12
- data/lib/rbx/bignum.fy +6 -2
- data/lib/rbx/block.fy +23 -26
- data/lib/rbx/class.fy +54 -2
- data/lib/rbx/code_loader.fy +8 -4
- data/lib/rbx/date.fy +9 -0
- data/lib/rbx/directory.fy +18 -0
- data/lib/rbx/environment_variables.fy +1 -0
- data/lib/rbx/exception.fy +9 -2
- data/lib/rbx/fiber.fy +22 -4
- data/lib/rbx/file.fy +5 -5
- data/lib/rbx/fixnum.fy +5 -0
- data/lib/rbx/float.fy +11 -3
- data/lib/rbx/hash.fy +31 -16
- data/lib/rbx/integer.fy +1 -0
- data/lib/rbx/io.fy +17 -7
- data/lib/rbx/match_data.fy +15 -4
- data/lib/rbx/method.fy +40 -7
- data/lib/rbx/name_error.fy +4 -0
- data/lib/rbx/object.fy +92 -24
- data/lib/rbx/range.fy +20 -6
- data/lib/rbx/regexp.fy +11 -3
- data/lib/rbx/string.fy +51 -1
- data/lib/rbx/stringio.fy +17 -0
- data/lib/rbx/symbol.fy +15 -1
- data/lib/rbx/system.fy +20 -2
- data/lib/rbx/tcp_server.fy +4 -1
- data/lib/rbx/tcp_socket.fy +11 -0
- data/lib/rbx/time.fy +6 -0
- data/lib/rbx/tuple.fy +14 -5
- data/lib/set.fy +144 -29
- data/lib/stack.fy +42 -11
- data/lib/string.fy +118 -8
- data/lib/struct.fy +13 -3
- data/lib/symbol.fy +21 -2
- data/lib/thread_pool.fy +2 -1
- data/lib/true_class.fy +45 -7
- data/lib/tuple.fy +27 -9
- data/lib/version.fy +2 -2
- data/ruby_lib/fancy +43 -0
- data/ruby_lib/fdoc +23 -0
- data/ruby_lib/fspec +3 -0
- data/ruby_lib/fyi +3 -0
- data/ruby_lib/ifancy +3 -0
- data/tests/argv.fy +5 -9
- data/tests/array.fy +323 -196
- data/tests/assignment.fy +29 -29
- data/tests/block.fy +72 -59
- data/tests/class.fy +227 -138
- data/tests/control_flow.fy +83 -51
- data/tests/documentation.fy +8 -8
- data/tests/enumerable.fy +8 -0
- data/tests/enumerator.fy +47 -29
- data/tests/exception.fy +49 -32
- data/tests/file.fy +28 -28
- data/tests/fixnum.fy +170 -0
- data/tests/future.fy +24 -7
- data/tests/hash.fy +55 -38
- data/tests/method.fy +50 -43
- data/tests/nil_class.fy +37 -37
- data/tests/object.fy +152 -70
- data/tests/pattern_matching.fy +67 -31
- data/tests/range.fy +6 -6
- data/tests/set.fy +101 -4
- data/tests/stack.fy +14 -5
- data/tests/string.fy +115 -61
- data/tests/stringio.fy +18 -0
- data/tests/struct.fy +27 -0
- data/tests/symbol.fy +19 -6
- data/tests/true_class.fy +34 -34
- data/tests/tuple.fy +30 -12
- metadata +103 -81
- data/boot/rbx-compiler/compiler/ast/require.rb +0 -20
- data/examples/actor.fy +0 -37
- data/examples/curl_async.fy +0 -37
- data/lib/compiler/ast/require.fy +0 -15
- data/tests/number.fy +0 -135
- data/tests/parsing/sexp.fy +0 -50
data/lib/message.fy
ADDED
data/lib/method.fy
CHANGED
@@ -3,20 +3,4 @@ class Method {
|
|
3
3
|
An instance of Method represents a method on a Class.
|
4
4
|
Every method in Fancy is an instance of the Method class.
|
5
5
|
"""
|
6
|
-
|
7
|
-
def tests {
|
8
|
-
"""
|
9
|
-
Returns an Array of all the FancySpec SpecTests defined for a
|
10
|
-
Method.
|
11
|
-
"""
|
12
|
-
|
13
|
-
@tests if_nil: { @tests = [] }
|
14
|
-
@tests
|
15
|
-
}
|
16
|
-
|
17
|
-
def test: test_block {
|
18
|
-
it = FancySpec new: self
|
19
|
-
test_block call: [it]
|
20
|
-
tests << it
|
21
|
-
}
|
22
6
|
}
|
data/lib/nil_class.fy
CHANGED
@@ -1,52 +1,102 @@
|
|
1
1
|
class NilClass {
|
2
|
-
"
|
2
|
+
"""
|
3
|
+
NilClass. The class of the singleton @nil value.
|
4
|
+
"""
|
3
5
|
|
4
6
|
def NilClass new {
|
7
|
+
"""
|
8
|
+
@return @nil.
|
9
|
+
"""
|
10
|
+
|
5
11
|
# always return nil singleton object when trying to create a new
|
6
12
|
# NilClass instance
|
7
13
|
nil
|
8
14
|
}
|
9
15
|
|
10
16
|
def if_true: block {
|
11
|
-
"
|
17
|
+
"""
|
18
|
+
@return @nil.
|
19
|
+
"""
|
20
|
+
|
12
21
|
nil
|
13
22
|
}
|
14
23
|
|
15
24
|
def if_true: then_block else: else_block {
|
16
|
-
"
|
25
|
+
"""
|
26
|
+
@return Value of calling @else_block.
|
27
|
+
|
28
|
+
Calls @else_block.
|
29
|
+
"""
|
17
30
|
else_block call
|
18
31
|
}
|
19
32
|
|
20
33
|
def if_nil: block {
|
34
|
+
"""
|
35
|
+
@block @Block@ to be called.
|
36
|
+
@return Value of calling @block with @self.
|
37
|
+
|
38
|
+
Calls @block with @self.
|
39
|
+
"""
|
40
|
+
|
21
41
|
block call: [self]
|
22
42
|
}
|
23
43
|
|
24
44
|
def if_nil: then_block else: else_block {
|
45
|
+
"""
|
46
|
+
@then_block @Block@ to be called with @self.
|
47
|
+
@else_block Gets ignored.
|
48
|
+
@return Value of calling @then_block with @self.
|
49
|
+
|
50
|
+
Calls @then_block with @self.
|
51
|
+
"""
|
52
|
+
|
25
53
|
then_block call: [self]
|
26
54
|
}
|
27
55
|
|
28
56
|
def nil? {
|
29
|
-
"
|
57
|
+
"""
|
58
|
+
@return @true.
|
59
|
+
"""
|
60
|
+
|
30
61
|
true
|
31
62
|
}
|
32
63
|
|
33
64
|
def to_s {
|
34
|
-
"
|
65
|
+
"""
|
66
|
+
@return An empty @String@.
|
67
|
+
"""
|
68
|
+
|
35
69
|
""
|
36
70
|
}
|
37
71
|
|
72
|
+
alias_method: 'inspect for: 'to_s
|
73
|
+
|
38
74
|
def to_a {
|
39
|
-
"
|
75
|
+
"""
|
76
|
+
@return An empty @Array@.
|
77
|
+
"""
|
78
|
+
|
40
79
|
[]
|
41
80
|
}
|
42
81
|
|
43
82
|
def not {
|
44
|
-
"
|
83
|
+
"""
|
84
|
+
@return @true.
|
85
|
+
"""
|
86
|
+
|
45
87
|
true
|
46
88
|
}
|
47
89
|
|
48
90
|
def inspect {
|
49
|
-
"
|
91
|
+
"""
|
92
|
+
@return @nil as a @String@.
|
93
|
+
"""
|
94
|
+
|
50
95
|
"nil"
|
51
96
|
}
|
52
97
|
}
|
98
|
+
|
99
|
+
nil documentation: """
|
100
|
+
@nil is the singleton nil value (only instance of @NilClass@).
|
101
|
+
NilClass##new yields @nil.
|
102
|
+
"""
|
data/lib/number.fy
CHANGED
@@ -76,19 +76,31 @@ class Number {
|
|
76
76
|
}
|
77
77
|
|
78
78
|
def squared {
|
79
|
-
"
|
79
|
+
"""
|
80
|
+
@return Squared value of @self.
|
81
|
+
|
82
|
+
Returns the square of a Number.
|
83
|
+
"""
|
80
84
|
|
81
85
|
self * self
|
82
86
|
}
|
83
87
|
|
84
88
|
def doubled {
|
85
|
-
"
|
89
|
+
"""
|
90
|
+
@return Doubled value of @self.
|
91
|
+
|
92
|
+
Returns the double value of a Number.
|
93
|
+
"""
|
86
94
|
|
87
95
|
self + self
|
88
96
|
}
|
89
97
|
|
90
98
|
def abs {
|
91
|
-
"
|
99
|
+
"""
|
100
|
+
@return Absolute (positive) value of @self.
|
101
|
+
|
102
|
+
Returns the absolute (positive) value of a Number.
|
103
|
+
"""
|
92
104
|
|
93
105
|
if: (self < 0) then: {
|
94
106
|
self * -1
|
@@ -98,41 +110,56 @@ class Number {
|
|
98
110
|
}
|
99
111
|
|
100
112
|
def negate {
|
101
|
-
"
|
113
|
+
"""
|
114
|
+
@return Negated value of @self.
|
115
|
+
|
116
|
+
Negates a Number (-1 becomes 1 and vice versa).
|
117
|
+
"""
|
102
118
|
|
103
119
|
self * -1
|
104
120
|
}
|
105
121
|
|
106
122
|
def even? {
|
107
|
-
"
|
123
|
+
"""
|
124
|
+
@return @true, if @self is even, @false otherwise.
|
125
|
+
|
126
|
+
Indicates, if a Number is even.
|
127
|
+
"""
|
108
128
|
|
109
129
|
modulo: 2 . == 0
|
110
130
|
}
|
111
131
|
|
112
132
|
def odd? {
|
113
|
-
"
|
133
|
+
"""
|
134
|
+
@return @true, if @self is odd, @false otherwise.
|
114
135
|
|
115
|
-
|
116
|
-
|
136
|
+
Indicates, if a Number is odd.
|
137
|
+
"""
|
117
138
|
|
118
|
-
|
119
|
-
self
|
139
|
+
self even? not
|
120
140
|
}
|
121
|
-
}
|
122
141
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
142
|
+
def max: other {
|
143
|
+
"""
|
144
|
+
@return Maximum value of @self and @other.
|
145
|
+
"""
|
127
146
|
|
128
|
-
|
147
|
+
if: (self < other) then: {
|
148
|
+
other
|
149
|
+
} else: {
|
150
|
+
self
|
151
|
+
}
|
129
152
|
}
|
130
153
|
|
131
|
-
def
|
132
|
-
"""
|
133
|
-
|
154
|
+
def min: other {
|
155
|
+
"""
|
156
|
+
@return Minimum value of @self and @other.
|
157
|
+
"""
|
134
158
|
|
135
|
-
|
159
|
+
if: (self < other) then: {
|
160
|
+
self
|
161
|
+
} else: {
|
162
|
+
other
|
163
|
+
}
|
136
164
|
}
|
137
|
-
}
|
138
|
-
|
165
|
+
}
|
data/lib/object.fy
CHANGED
@@ -12,140 +12,205 @@ class Object {
|
|
12
12
|
Returns the @String concatenation of @self and @other.
|
13
13
|
Calls to_s on @self and @other and concatenates the results to a new @String.
|
14
14
|
"""
|
15
|
+
|
15
16
|
to_s + (other to_s)
|
16
17
|
}
|
17
18
|
|
18
19
|
def loop: block {
|
19
|
-
"
|
20
|
-
block loop
|
20
|
+
"""
|
21
|
+
@block @Block@ to be called endlessly (loop).
|
22
|
+
|
23
|
+
Infinitely calls the block (loops).
|
24
|
+
"""
|
25
|
+
|
26
|
+
{ true } while_true: block
|
21
27
|
}
|
22
28
|
|
23
29
|
def println {
|
24
|
-
"
|
30
|
+
"""
|
31
|
+
Same as:
|
32
|
+
Console println: self
|
33
|
+
|
34
|
+
Prints @self on @STDOUT, followed by a newline.
|
35
|
+
"""
|
36
|
+
|
25
37
|
Console println: to_s
|
26
38
|
}
|
27
39
|
|
28
40
|
def print {
|
29
|
-
"
|
41
|
+
"""
|
42
|
+
Same as:
|
43
|
+
Console print: self
|
44
|
+
|
45
|
+
Prints @self on STDOUT.
|
46
|
+
"""
|
47
|
+
|
30
48
|
Console print: to_s
|
31
49
|
}
|
32
50
|
|
33
51
|
def != other {
|
34
|
-
"
|
52
|
+
"""
|
53
|
+
@other Other object to compare against.
|
54
|
+
@return @true if @self is not equal to @other, @false otherwise.
|
55
|
+
|
56
|
+
Indicates, if two objects are not equal.
|
57
|
+
"""
|
58
|
+
|
35
59
|
self == other not
|
36
60
|
}
|
37
61
|
|
38
62
|
def if_true: block {
|
39
|
-
"
|
63
|
+
"""
|
64
|
+
@block @Block@ to be called.
|
65
|
+
@return Value of calling @block with @self.
|
66
|
+
|
67
|
+
Calls the @block (default behaviour).
|
68
|
+
"""
|
69
|
+
|
40
70
|
block call: [self]
|
41
71
|
}
|
42
72
|
|
43
73
|
def if_true: then_block else: else_block {
|
44
|
-
"
|
74
|
+
"""
|
75
|
+
@then_block @Block@ to be called.
|
76
|
+
@else_block Does not get called (default behaviour).
|
77
|
+
|
78
|
+
@return Value of calling @then_block with @self.
|
79
|
+
|
80
|
+
Calls the @then_block (default behaviour).
|
81
|
+
"""
|
82
|
+
|
45
83
|
then_block call: [self]
|
46
84
|
}
|
47
85
|
|
48
86
|
def if_false: block {
|
49
|
-
"
|
87
|
+
"""
|
88
|
+
@return @nil
|
89
|
+
|
90
|
+
Does nothing (default behaviour).
|
91
|
+
"""
|
50
92
|
nil
|
51
93
|
}
|
52
94
|
|
53
95
|
def if_false: then_block else: else_block {
|
54
|
-
"
|
55
|
-
|
56
|
-
|
96
|
+
"""
|
97
|
+
@then_block Does not get called (default behaviour).
|
98
|
+
@else_block @Block@ to be called.
|
99
|
+
@return Value of calling @else_block.
|
57
100
|
|
58
|
-
|
59
|
-
"
|
60
|
-
nil
|
61
|
-
}
|
101
|
+
Calls @else_block (default behaviour).
|
102
|
+
"""
|
62
103
|
|
63
|
-
def if_nil: then_block else: else_block {
|
64
|
-
"Calls the @then_block if @nil? returns @true - otherwise @else_block is called"
|
65
104
|
else_block call
|
66
105
|
}
|
67
106
|
|
107
|
+
alias_method: 'if_nil: for: 'if_false:
|
108
|
+
alias_method: 'if_nil:else: for: 'if_false:else:
|
109
|
+
|
68
110
|
def nil? {
|
69
|
-
"
|
111
|
+
"""
|
112
|
+
@return @false.
|
113
|
+
"""
|
114
|
+
|
70
115
|
false
|
71
116
|
}
|
72
117
|
|
73
118
|
def false? {
|
74
|
-
"
|
75
|
-
false
|
76
|
-
|
119
|
+
"""
|
120
|
+
@return @false.
|
121
|
+
"""
|
77
122
|
|
78
|
-
def true? {
|
79
|
-
"Returns @false."
|
80
123
|
false
|
81
124
|
}
|
82
125
|
|
83
|
-
def
|
84
|
-
"
|
85
|
-
|
86
|
-
|
87
|
-
other
|
88
|
-
} else: {
|
89
|
-
self
|
90
|
-
}
|
91
|
-
}
|
126
|
+
def true? {
|
127
|
+
"""
|
128
|
+
@return @false.
|
129
|
+
"""
|
92
130
|
|
93
|
-
|
94
|
-
0
|
131
|
+
false
|
95
132
|
}
|
96
133
|
|
97
134
|
def to_a {
|
135
|
+
"""
|
136
|
+
@return @Array@ representation of @self.
|
137
|
+
"""
|
138
|
+
|
98
139
|
[self]
|
99
140
|
}
|
100
141
|
|
101
142
|
def to_i {
|
143
|
+
"""
|
144
|
+
@return @Fixnum@ representation of @self.
|
145
|
+
"""
|
146
|
+
|
102
147
|
0
|
103
148
|
}
|
104
149
|
|
105
150
|
def to_enum {
|
151
|
+
"""
|
152
|
+
@return @FancyEnumerator@ for @self using 'each: for iteration.
|
153
|
+
"""
|
154
|
+
|
106
155
|
FancyEnumerator new: self
|
107
156
|
}
|
108
157
|
|
109
158
|
def to_enum: iterator {
|
159
|
+
"""
|
160
|
+
@iterator Message to use for iteration on @self.
|
161
|
+
@return @FancyEnumerator@ for @self using @iterator for iteration.
|
162
|
+
"""
|
163
|
+
|
110
164
|
FancyEnumerator new: self with: iterator
|
111
165
|
}
|
112
166
|
|
113
167
|
def and: other {
|
114
168
|
"""
|
169
|
+
@other Object or @Block@ (for short-circuit evaluation) to compare @self to.
|
170
|
+
@return @other if both @self and @other are true-ish, @self otherwise.
|
171
|
+
|
115
172
|
Boolean conjunction.
|
116
|
-
|
173
|
+
If @self and @other are both true-ish (non-nil, non-false), returns @other.
|
174
|
+
If @other is a @Block@, calls it and returns its return value.
|
117
175
|
"""
|
118
176
|
|
119
177
|
if_true: {
|
120
178
|
{ other = other call } if: (other is_a?: Block)
|
121
|
-
|
179
|
+
other
|
180
|
+
} else: {
|
181
|
+
self
|
122
182
|
}
|
123
|
-
return self
|
124
183
|
}
|
125
184
|
|
126
185
|
def or: other {
|
127
186
|
"""
|
187
|
+
@other Object or @Block@ (for short-circuit evaluation) to compare @self to.
|
188
|
+
@return @self if @self is true-ish, @other otherwise.
|
189
|
+
|
128
190
|
Boolean disjunction.
|
129
|
-
|
191
|
+
If @self is true-ish (non-nil, non-false) returns @self.
|
192
|
+
Otherwise returns @other (if @other is a @Block@, calls it first and returns its return value)
|
130
193
|
"""
|
194
|
+
|
131
195
|
if_true: {
|
132
|
-
|
196
|
+
self
|
133
197
|
} else: {
|
134
198
|
{ other = other call } if: (other is_a?: Block)
|
135
|
-
|
199
|
+
other
|
136
200
|
}
|
137
201
|
}
|
138
202
|
|
139
|
-
def
|
203
|
+
def xor: other {
|
140
204
|
"""
|
141
|
-
|
142
|
-
|
205
|
+
@other @Object@ to compare @self against.
|
206
|
+
@return @true if only one of @self and @other is true, @false otherwise.
|
143
207
|
"""
|
144
|
-
|
145
|
-
|
146
|
-
|
208
|
+
|
209
|
+
if_true: {
|
210
|
+
other not
|
211
|
+
} else: {
|
212
|
+
other not not
|
147
213
|
}
|
148
|
-
return self
|
149
214
|
}
|
150
215
|
|
151
216
|
alias_method: ':&& for: 'and:
|
@@ -156,6 +221,7 @@ class Object {
|
|
156
221
|
Same as:
|
157
222
|
cond if_true: block
|
158
223
|
"""
|
224
|
+
|
159
225
|
cond if_true: block
|
160
226
|
}
|
161
227
|
|
@@ -164,6 +230,7 @@ class Object {
|
|
164
230
|
Same as:
|
165
231
|
cond if_true: then_block else: else_block
|
166
232
|
"""
|
233
|
+
|
167
234
|
cond if_true: then_block else: else_block
|
168
235
|
}
|
169
236
|
|
@@ -185,6 +252,26 @@ class Object {
|
|
185
252
|
cond_block until_do: body_block
|
186
253
|
}
|
187
254
|
|
255
|
+
def do: body_block while: cond_block {
|
256
|
+
"""
|
257
|
+
@body_block @Block@ to be called at least once and as long as @cond_block yields a true-ish value.
|
258
|
+
@cond_block Condition @Block@ used to determine if @body_block@ should be called again.
|
259
|
+
"""
|
260
|
+
|
261
|
+
body_block call: [nil]
|
262
|
+
cond_block while_do: body_block
|
263
|
+
}
|
264
|
+
|
265
|
+
def do: body_block until: cond_block {
|
266
|
+
"""
|
267
|
+
@body_block @Block@ to be called at least once and as long as @cond_block yields a false-ish value.
|
268
|
+
@cond_block Condition @Block@ used to determine if @body_block@ should be called again.
|
269
|
+
"""
|
270
|
+
|
271
|
+
body_block call
|
272
|
+
cond_block until_do: body_block
|
273
|
+
}
|
274
|
+
|
188
275
|
def unless: cond do: block {
|
189
276
|
"""
|
190
277
|
Same as:
|
@@ -194,24 +281,51 @@ class Object {
|
|
194
281
|
cond if_true: { nil } else: block
|
195
282
|
}
|
196
283
|
|
284
|
+
def unless: cond do: block else: else_block {
|
285
|
+
"""
|
286
|
+
Same as:
|
287
|
+
cond if_true: else_block else: block
|
288
|
+
"""
|
289
|
+
|
290
|
+
cond if_true: else_block else: block
|
291
|
+
}
|
292
|
+
|
197
293
|
def method: method_name {
|
198
|
-
"
|
294
|
+
"""
|
295
|
+
@return @Method@ with @method_name defined for @self, or @nil.
|
296
|
+
Returns the method with a given name for self, if defined.
|
297
|
+
"""
|
199
298
|
|
200
299
|
method(message_name: method_name)
|
201
300
|
}
|
202
301
|
|
203
302
|
def documentation {
|
204
|
-
"
|
205
|
-
Fancy
|
303
|
+
"""
|
304
|
+
@return @Fancy::Documentation@ object for @self.
|
305
|
+
|
306
|
+
Returns the @Fancy::Documentation@ object for an Object.
|
307
|
+
"""
|
308
|
+
|
309
|
+
Fancy Documentation for: self
|
206
310
|
}
|
207
311
|
|
208
|
-
def documentation:
|
209
|
-
"
|
210
|
-
|
312
|
+
def documentation: docstring {
|
313
|
+
"""
|
314
|
+
@docstring New docstring for @self.
|
315
|
+
|
316
|
+
Sets the documentation string for an Object.
|
317
|
+
"""
|
318
|
+
|
319
|
+
Fancy Documentation for: self is: docstring
|
211
320
|
}
|
212
321
|
|
213
322
|
def identity {
|
214
|
-
"
|
323
|
+
"""
|
324
|
+
@return @self.
|
325
|
+
|
326
|
+
The identity method simply returns self.
|
327
|
+
"""
|
328
|
+
|
215
329
|
self
|
216
330
|
}
|
217
331
|
|
@@ -268,38 +382,230 @@ class Object {
|
|
268
382
|
}
|
269
383
|
|
270
384
|
def ? future {
|
385
|
+
"""
|
386
|
+
@future Future object to get the value from.
|
387
|
+
@return Result of calling #value on @future.
|
388
|
+
|
389
|
+
Calls #value on @future. Shortcut method.
|
390
|
+
"""
|
391
|
+
|
271
392
|
future value
|
272
393
|
}
|
273
394
|
|
274
395
|
def yield {
|
396
|
+
"""
|
397
|
+
Same as Fiber##yield.
|
398
|
+
"""
|
399
|
+
|
275
400
|
Fiber yield
|
276
401
|
}
|
277
402
|
|
278
403
|
def yield: values {
|
279
|
-
|
280
|
-
|
404
|
+
"""
|
405
|
+
Same as Fiber##yield:
|
406
|
+
"""
|
281
407
|
|
282
|
-
|
283
|
-
Fiber yield: [seconds]
|
408
|
+
Fiber yield: values
|
284
409
|
}
|
285
410
|
|
286
411
|
def next {
|
287
|
-
"
|
412
|
+
"""
|
413
|
+
Skip to the next iteration.
|
414
|
+
"""
|
415
|
+
|
288
416
|
Fancy NextIteration new raise!
|
289
417
|
}
|
290
418
|
|
291
419
|
def next: value {
|
292
|
-
"
|
293
|
-
|
420
|
+
"""
|
421
|
+
@value Value for next iteration.
|
422
|
+
|
423
|
+
Returns @value for current iteration and skip to the next one.
|
424
|
+
"""
|
425
|
+
|
426
|
+
Fancy NextIteration new: value . raise!
|
294
427
|
}
|
295
428
|
|
296
429
|
def break {
|
297
|
-
"
|
430
|
+
"""
|
431
|
+
Breaks / Stops current iteration.
|
432
|
+
"""
|
433
|
+
|
298
434
|
Fancy BreakIteration new raise!
|
299
435
|
}
|
300
436
|
|
301
437
|
def break: value {
|
302
|
-
"
|
303
|
-
|
438
|
+
"""
|
439
|
+
@value Value to return from iteration.
|
440
|
+
|
441
|
+
Returns @value from iteratioen.
|
442
|
+
"""
|
443
|
+
|
444
|
+
Fancy BreakIteration new: value . raise!
|
445
|
+
}
|
446
|
+
|
447
|
+
def __spawn_actor__ {
|
448
|
+
@__actor__active__ = true
|
449
|
+
Actor spawn: {
|
450
|
+
__actor__loop__
|
451
|
+
}
|
452
|
+
}
|
453
|
+
|
454
|
+
def __actor__loop__ {
|
455
|
+
while: { @__actor__active__ } do: {
|
456
|
+
sender = nil
|
457
|
+
try {
|
458
|
+
type, msg, sender = Actor receive
|
459
|
+
msg, params = msg
|
460
|
+
match type {
|
461
|
+
case 'async ->
|
462
|
+
self receive_message: msg with_params: params
|
463
|
+
case 'future ->
|
464
|
+
val = self receive_message: msg with_params: params
|
465
|
+
sender completed: val
|
466
|
+
}
|
467
|
+
} catch Exception => e {
|
468
|
+
{ sender failed: e } if: sender
|
469
|
+
die!
|
470
|
+
e raise!
|
471
|
+
}
|
472
|
+
}
|
473
|
+
}
|
474
|
+
|
475
|
+
def __actor__die!__ {
|
476
|
+
@__actor__active__ = false
|
477
|
+
@__actor__ = nil
|
478
|
+
}
|
479
|
+
|
480
|
+
def __actor__ {
|
481
|
+
@__actor__ = @__actor__ || { __spawn_actor__ }
|
482
|
+
@__actor__
|
483
|
+
}
|
484
|
+
|
485
|
+
protected: [ '__spawn_actor__, '__actor__loop__, '__actor__die!__, '__actor__ ]
|
486
|
+
|
487
|
+
def die! {
|
488
|
+
"""
|
489
|
+
Tells an object to let its actor to die (quit running).
|
490
|
+
"""
|
491
|
+
|
492
|
+
__actor__die!__
|
493
|
+
}
|
494
|
+
|
495
|
+
def actor {
|
496
|
+
"""
|
497
|
+
Returns the Object's actor.
|
498
|
+
If none exists at this moment, a new one will be created
|
499
|
+
and starts running in the background.
|
500
|
+
"""
|
501
|
+
|
502
|
+
__actor__
|
503
|
+
}
|
504
|
+
|
505
|
+
def send_future: message with_params: params ([]) {
|
506
|
+
"""
|
507
|
+
@message Message to be sent as a @FutureSend@.
|
508
|
+
@params @Array@ of parameters of the @FutureSend@.
|
509
|
+
@return @FutureSend@ object that will hold the return value of @message with @params on @self.
|
510
|
+
|
511
|
+
Creates a @FutureSend@ object (a Future / Promise) that will hold the value of sending @message to @self.
|
512
|
+
"""
|
513
|
+
|
514
|
+
FutureSend new: __actor__ receiver: self message: message with_params: params
|
515
|
+
}
|
516
|
+
|
517
|
+
def send_async: message with_params: params ([]) {
|
518
|
+
"""
|
519
|
+
@message Message to be sent asynchronously to @self.
|
520
|
+
@params @Array@ of parameters as part of sending @message asynchronously to @self.
|
521
|
+
@return @nil
|
522
|
+
|
523
|
+
Sends @message with @params to @self asynchronously and immediately returns @nil.
|
524
|
+
"""
|
525
|
+
|
526
|
+
__actor__ ! ('async, (message, params), nil)
|
527
|
+
nil
|
528
|
+
}
|
529
|
+
|
530
|
+
def synchronized: block {
|
531
|
+
"""
|
532
|
+
@block @Block@ to be run only by one Thread at a time.
|
533
|
+
|
534
|
+
Runs a given @Block@ in a synchronized fashion if called by multiple Threads.
|
535
|
+
Uses a @Mutex@ in the background for synchronization (created on demand for each @Object@).
|
536
|
+
"""
|
537
|
+
|
538
|
+
@__mutex__ = @__mutex__ || { Mutex new() }
|
539
|
+
@__mutex__ synchronize(&block)
|
540
|
+
}
|
541
|
+
|
542
|
+
def copy_slots: slots from: object {
|
543
|
+
slots each: |s| {
|
544
|
+
set_slot: s value: (object get_slot: s)
|
545
|
+
}
|
546
|
+
}
|
547
|
+
|
548
|
+
def get_slots: slots {
|
549
|
+
"""
|
550
|
+
@slots @Array@ of slot names to retrieve from @self.
|
551
|
+
@return @Array@ of slot values of slot names passed in via @slots.
|
552
|
+
"""
|
553
|
+
|
554
|
+
slots map: |s| {
|
555
|
+
get_slot: s
|
556
|
+
}
|
557
|
+
}
|
558
|
+
|
559
|
+
def <=> other {
|
560
|
+
"""
|
561
|
+
@other Other object to compare against.
|
562
|
+
@return -1 if @self is smaller, 0 if @self is equal or 1 if @self is greater or equal compared to @other.
|
563
|
+
"""
|
564
|
+
|
565
|
+
{ return -1 } if: (self < other)
|
566
|
+
{ return 0 } if: (self == other)
|
567
|
+
return 1 # greater or equal to other
|
568
|
+
}
|
569
|
+
|
570
|
+
def do: block {
|
571
|
+
"""
|
572
|
+
@block @Block@ to be called in the context of @self.
|
573
|
+
|
574
|
+
Helper method that calls @block with @self as the receiver.
|
575
|
+
This allows message cascading like code, e.g.:
|
576
|
+
|
577
|
+
some_complex_object do: {
|
578
|
+
method_1: arg1
|
579
|
+
method_2: arg2
|
580
|
+
method_3: arg3
|
581
|
+
}
|
582
|
+
|
583
|
+
# this is the same as:
|
584
|
+
some_complex_object method_1: arg1
|
585
|
+
some_complex_object method_2: arg2
|
586
|
+
some_complex_object method_3: arg3
|
587
|
+
"""
|
588
|
+
|
589
|
+
block call_with_receiver: self
|
590
|
+
}
|
591
|
+
|
592
|
+
def slots {
|
593
|
+
"""
|
594
|
+
@return @Set@ of slot names that @self has.
|
595
|
+
"""
|
596
|
+
|
597
|
+
Set new: $ instance_variables map: |s| {
|
598
|
+
s rest to_sym
|
599
|
+
}
|
600
|
+
}
|
601
|
+
|
602
|
+
def sleep: seconds {
|
603
|
+
"""
|
604
|
+
@seconds Amount of seconds to sleep.
|
605
|
+
|
606
|
+
Sets the current Thread (in which self is running) for a given amount to sleep.
|
607
|
+
"""
|
608
|
+
|
609
|
+
Thread sleep: seconds
|
304
610
|
}
|
305
|
-
}
|
611
|
+
}
|