fancy 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +2 -0
- data/README.md +6 -1
- data/bin/fancy +6 -0
- data/bin/ifancy +44 -3
- data/boot/fancy_ext/module.rb +4 -0
- data/boot/fancy_ext/object.rb +4 -0
- data/boot/rbx-compiler/compiler/ast/block.rb +29 -1
- data/boot/rbx-compiler/compiler/ast/identifier.rb +6 -0
- data/boot/rbx-compiler/compiler/ast/message_send.rb +1 -0
- data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
- data/boot/rbx-compiler/parser/lexer.lex +2 -0
- data/boot/rbx-compiler/parser/parser.rb +6 -0
- data/boot/rbx-compiler/parser/parser.y +14 -1
- data/doc/api/fancy.jsonp +1 -1
- data/doc/features.md +24 -0
- data/examples/99bottles.fy +5 -0
- data/examples/conditions_exceptions.fy +9 -0
- data/examples/conditions_parsing.fy +68 -0
- data/examples/greeter.fy +9 -0
- data/examples/html_generator.fy +59 -29
- data/examples/webserver/webserver.fy +8 -11
- data/lib/argv.fy +6 -0
- data/lib/array.fy +17 -35
- data/lib/block.fy +82 -1
- data/lib/boot.fy +4 -2
- data/lib/compiler.fy +2 -2
- data/lib/compiler/ast/block.fy +24 -20
- data/lib/compiler/ast/message_send.fy +11 -0
- data/lib/contracts.fy +60 -0
- data/lib/dynamic_slot_object.fy +61 -0
- data/lib/enumerable.fy +432 -394
- data/lib/enumerator.fy +152 -150
- data/lib/fdoc.fy +4 -17
- data/lib/fiber.fy +4 -10
- data/lib/file.fy +33 -25
- data/lib/future.fy +59 -5
- data/lib/hash.fy +54 -1
- data/lib/html.fy +107 -0
- data/lib/kvo.fy +173 -0
- data/lib/main.fy +6 -2
- data/lib/message_sink.fy +19 -0
- data/lib/number.fy +48 -0
- data/lib/object.fy +65 -13
- data/lib/package.fy +12 -2
- data/lib/package/dependency.fy +13 -0
- data/lib/package/dependency_installer.fy +27 -0
- data/lib/package/installer.fy +4 -10
- data/lib/package/uninstaller.fy +1 -3
- data/lib/parser/ext/lexer.lex +8 -3
- data/lib/parser/ext/parser.y +4 -1
- data/lib/parser/methods.fy +7 -3
- data/lib/range.fy +1 -1
- data/lib/rbx.fy +2 -1
- data/lib/rbx/array.fy +28 -12
- data/lib/rbx/bignum.fy +1 -1
- data/lib/rbx/block.fy +27 -0
- data/lib/rbx/console.fy +6 -6
- data/lib/rbx/date.fy +6 -1
- data/lib/rbx/documentation.fy +8 -3
- data/lib/rbx/exception.fy +5 -0
- data/lib/rbx/file.fy +40 -7
- data/lib/rbx/fixnum.fy +12 -1
- data/lib/rbx/method.fy +9 -2
- data/lib/rbx/module.fy +24 -0
- data/lib/rbx/regexp.fy +8 -0
- data/lib/rbx/string.fy +23 -7
- data/lib/rbx/tcp_server.fy +4 -2
- data/lib/rbx/tcp_socket.fy +14 -0
- data/lib/remote_object.fy +59 -0
- data/lib/set.fy +15 -4
- data/lib/string.fy +38 -5
- data/lib/stringio.fy +1 -0
- data/lib/symbol.fy +4 -0
- data/lib/system.fy +22 -0
- data/lib/thread_pool.fy +2 -2
- data/lib/tuple.fy +18 -1
- data/lib/vars.fy +17 -0
- data/lib/version.fy +1 -1
- data/ruby_lib/fancy +6 -0
- data/tests/array.fy +30 -0
- data/tests/block.fy +106 -0
- data/tests/class.fy +19 -0
- data/tests/enumerable.fy +1 -1
- data/tests/enumerator.fy +5 -5
- data/tests/file.fy +28 -0
- data/tests/fixnum.fy +0 -50
- data/tests/future.fy +9 -24
- data/tests/hash.fy +35 -0
- data/tests/html.fy +33 -0
- data/tests/kvo.fy +101 -0
- data/tests/number.fy +75 -0
- data/tests/object.fy +50 -3
- data/tests/string.fy +19 -10
- data/tests/symbol.fy +5 -0
- data/tests/tuple.fy +7 -0
- data/tools/fancy-mode.el +5 -1
- metadata +22 -21
- data/boot/compiler/parser/ext/fancy_parser.bundle +0 -0
- data/boot/rbx-compiler/parser/Makefile +0 -156
- data/boot/rbx-compiler/parser/lexer.c +0 -2310
- data/boot/rbx-compiler/parser/lexer.h +0 -315
- data/boot/rbx-compiler/parser/parser.c +0 -2946
- data/boot/rbx-compiler/parser/parser.h +0 -151
- data/lib/fiber_pool.fy +0 -78
- data/lib/method.fy +0 -6
- data/lib/parser/ext/Makefile +0 -156
- data/lib/parser/ext/fancy_parser.bundle +0 -0
- data/lib/parser/ext/lexer.c +0 -2392
- data/lib/parser/ext/lexer.h +0 -315
- data/lib/parser/ext/parser.c +0 -3251
- data/lib/parser/ext/parser.h +0 -161
data/tests/class.fy
CHANGED
@@ -548,4 +548,23 @@ FancySpec describe: Class with: {
|
|
548
548
|
b to_s is: "foobar"
|
549
549
|
b empty_method is: nil
|
550
550
|
}
|
551
|
+
|
552
|
+
class WithConstants {
|
553
|
+
Foo = "foo"
|
554
|
+
Bar = "bar"
|
555
|
+
class Nested
|
556
|
+
}
|
557
|
+
|
558
|
+
it: "returns its nested constants" with: 'constants when: {
|
559
|
+
WithConstants constants =? ["Foo", "Bar", "Nested"] is: true
|
560
|
+
}
|
561
|
+
|
562
|
+
it: "returns a constants value" with: '[] when: {
|
563
|
+
WithConstants["Foo"] is: "foo"
|
564
|
+
WithConstants["Foo"] is: WithConstants Foo
|
565
|
+
WithConstants["Bar"] is: "bar"
|
566
|
+
WithConstants["Bar"] is: WithConstants Bar
|
567
|
+
WithConstants["Nested"] is_a?: Class . is: true
|
568
|
+
WithConstants["Nested"] is: WithConstants Nested
|
569
|
+
}
|
551
570
|
}
|
data/tests/enumerable.fy
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
FancySpec describe:
|
1
|
+
FancySpec describe: Fancy Enumerable with: {
|
2
2
|
it: "selects the right element based on a comparison Block and an optional selection Block" with: 'superior_by:taking: when: {
|
3
3
|
[1,2,3,4,5] superior_by: '> . is: 5
|
4
4
|
[1,2,3,4,5] superior_by: '< . is: 1
|
data/tests/enumerator.fy
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
FancySpec describe:
|
1
|
+
FancySpec describe: Fancy Enumerator with: {
|
2
2
|
it: "iterates with 'next" with: 'new: when: {
|
3
|
-
enum =
|
3
|
+
enum = Fancy Enumerator new: (42..50)
|
4
4
|
enum next is: 42
|
5
5
|
enum next is: 43
|
6
6
|
}
|
7
7
|
|
8
8
|
it: "peeks to find next element" with: 'peek when: {
|
9
|
-
enum =
|
9
|
+
enum = Fancy Enumerator new: (42..50)
|
10
10
|
enum peek is: 42
|
11
11
|
enum peek is: 42
|
12
12
|
enum next is: 42
|
@@ -16,12 +16,12 @@ FancySpec describe: FancyEnumerator with: {
|
|
16
16
|
enum next is: 43
|
17
17
|
}
|
18
18
|
|
19
|
-
it: "turns an object with 'each: into an
|
19
|
+
it: "turns an object with 'each: into an Fancy Enumerator" with: 'to_enum when: {
|
20
20
|
enum = (42..45) to_enum
|
21
21
|
enum next is: 42
|
22
22
|
}
|
23
23
|
|
24
|
-
it: "turns an object with given method into an
|
24
|
+
it: "turns an object with given method into an Fancy Enumerator" with: 'to_enum: when: {
|
25
25
|
o = {}
|
26
26
|
def o iter: block {
|
27
27
|
1 upto: 10 do: block
|
data/tests/file.fy
CHANGED
@@ -5,6 +5,34 @@ FancySpec describe: File with: {
|
|
5
5
|
file close
|
6
6
|
}
|
7
7
|
|
8
|
+
it: "reads a file correctly" with: 'read:with: when: {
|
9
|
+
lines = File read: "README.md" . lines
|
10
|
+
idx = 0
|
11
|
+
|
12
|
+
File read: "README.md" with: |f| {
|
13
|
+
until: { f eof? } do: {
|
14
|
+
lines[idx] is: (f readline chomp)
|
15
|
+
idx = idx + 1
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
it: "writes a file correctly" with: 'write:with: when: {
|
21
|
+
dirname = "tmp"
|
22
|
+
filename = "#{dirname}/write_test.txt"
|
23
|
+
|
24
|
+
Directory create!: dirname
|
25
|
+
File write: filename with: |f| {
|
26
|
+
10 times: |i| {
|
27
|
+
f println: i
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
File read: filename . lines is: $ ["0","1","2","3","4","5","6","7","8","9"]
|
32
|
+
File delete: filename
|
33
|
+
Directory delete: dirname
|
34
|
+
}
|
35
|
+
|
8
36
|
it: "is open after opening it and closed after closing" with: 'close when: {
|
9
37
|
file = File open: "README.md" modes: ['read]
|
10
38
|
file open? is: true
|
data/tests/fixnum.fy
CHANGED
@@ -53,26 +53,6 @@ FancySpec describe: Fixnum with: {
|
|
53
53
|
2 even? is: true
|
54
54
|
}
|
55
55
|
|
56
|
-
it: "returns an array from 0 upto 10" with: 'upto: when: {
|
57
|
-
0 upto: 10 . is: [0,1,2,3,4,5,6,7,8,9,10]
|
58
|
-
}
|
59
|
-
|
60
|
-
it: "iterates from 1 upto 10" with: 'upto:do: when: {
|
61
|
-
sum = 0
|
62
|
-
1 upto: 10 do: |n| { sum = sum + n }
|
63
|
-
sum is: 55
|
64
|
-
}
|
65
|
-
|
66
|
-
it: "returns an array from 10 downto 0" with: 'downto: when: {
|
67
|
-
10 downto: 0 . is: [10,9,8,7,6,5,4,3,2,1,0]
|
68
|
-
}
|
69
|
-
|
70
|
-
it: "iterates from 10 downto 1" with: 'downto:do: when: {
|
71
|
-
sum = 0
|
72
|
-
10 downto: 1 do: |n| { sum = sum + n }
|
73
|
-
sum is: 55
|
74
|
-
}
|
75
|
-
|
76
56
|
it: "calculates the given power of itself" with: '** when: {
|
77
57
|
2 ** 3 is: 8
|
78
58
|
2 ** 0 is: 1
|
@@ -84,22 +64,6 @@ FancySpec describe: Fixnum with: {
|
|
84
64
|
}
|
85
65
|
}
|
86
66
|
|
87
|
-
it: "is the square of self" with: 'squared when: {
|
88
|
-
5 squared is: 25
|
89
|
-
10 squared is: 100
|
90
|
-
20 upto: 50 do: |i| {
|
91
|
-
i squared is: (i * i)
|
92
|
-
}
|
93
|
-
}
|
94
|
-
|
95
|
-
it: "is the double value of self" with: 'doubled when: {
|
96
|
-
5 doubled is: 10
|
97
|
-
10 doubled is: 20
|
98
|
-
20 upto: 50 do: |i| {
|
99
|
-
i doubled is: (i + i)
|
100
|
-
}
|
101
|
-
}
|
102
|
-
|
103
67
|
it: "is the same when using underscores within the literal" when: {
|
104
68
|
50000 is: 50_000
|
105
69
|
100_000 is: 100000
|
@@ -153,18 +117,4 @@ FancySpec describe: Fixnum with: {
|
|
153
117
|
times_called is: 10
|
154
118
|
sum is: ((10..19) sum)
|
155
119
|
}
|
156
|
-
|
157
|
-
it: "returns the maximum" with: 'max: when: {
|
158
|
-
0 max: 0 . is: 0
|
159
|
-
1 max: 2 . is: 2
|
160
|
-
2 max: 1 . is: 2
|
161
|
-
-2 max: -3 . is: -2
|
162
|
-
}
|
163
|
-
|
164
|
-
it: "returns the minimum" with: 'min: when: {
|
165
|
-
0 min: 0 . is: 0
|
166
|
-
-1 min: 0 . is: -1
|
167
|
-
-2 min: -3 . is: -3
|
168
|
-
2 min: 1 . is: 1
|
169
|
-
}
|
170
120
|
}
|
data/tests/future.fy
CHANGED
@@ -16,15 +16,15 @@ FancySpec describe: FutureSend with: {
|
|
16
16
|
a is: nil
|
17
17
|
}
|
18
18
|
|
19
|
-
it: "composes Futures to create execution pipelines" with: '&& when: {
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
# it: "composes Futures to create execution pipelines" with: '&& when: {
|
20
|
+
# def some_computation: num {
|
21
|
+
# num upto: (num ** num ** num)
|
22
|
+
# }
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
}
|
24
|
+
# f = self @ some_computation: 2 && @{select: 'even?} && @{size}
|
25
|
+
# f is_a?: FutureSend . is: true
|
26
|
+
# f value is_a?: Fixnum . is: true
|
27
|
+
# }
|
28
28
|
|
29
29
|
it: "accesses the same future from multiple threads and blocks them until the value is computed" when: {
|
30
30
|
def another_method {
|
@@ -49,23 +49,8 @@ FancySpec describe: FutureSend with: {
|
|
49
49
|
"error!" raise!
|
50
50
|
}
|
51
51
|
f = self @ a_failing_method
|
52
|
-
f
|
52
|
+
f value # wait for completion
|
53
53
|
f failure message is: "error!"
|
54
54
|
f failed? is: true
|
55
55
|
}
|
56
|
-
}
|
57
|
-
|
58
|
-
FancySpec describe: FutureCollection with: {
|
59
|
-
it: "executes a block for each future in the collection when it's ready" with: 'each: when: {
|
60
|
-
futures = 0 upto: 10 . map: |i| {
|
61
|
-
i ** i @ ** i
|
62
|
-
}
|
63
|
-
|
64
|
-
fc = FutureCollection new: futures
|
65
|
-
fc each: |val| {
|
66
|
-
val is_a?: Integer . is: true
|
67
|
-
}
|
68
|
-
|
69
|
-
fc await_all
|
70
|
-
}
|
71
56
|
}
|
data/tests/hash.fy
CHANGED
@@ -35,6 +35,13 @@ FancySpec describe: Hash with: {
|
|
35
35
|
hash at: 'foo . is: 'foobarbaz
|
36
36
|
}
|
37
37
|
|
38
|
+
it: "calls the block if it can't find the key" with: 'at:else: when: {
|
39
|
+
hash = <['foo => "bar", 'bar => nil]>
|
40
|
+
hash at: 'foo else: { "hello" } . is: "bar"
|
41
|
+
hash at: 'bar else: { "hello" } . is: nil
|
42
|
+
hash at: 'foo1 else: { "hello" } . is: "hello"
|
43
|
+
}
|
44
|
+
|
38
45
|
it: "returns all keys" with: 'keys when: {
|
39
46
|
hash = <['foo => "bar", 'bar => "baz", 'foobar => 112.21]>
|
40
47
|
hash keys is =? ['foo, 'bar, 'foobar]
|
@@ -115,4 +122,32 @@ FancySpec describe: Hash with: {
|
|
115
122
|
h includes?: "bar" . is: false
|
116
123
|
h includes?: nil . is: false
|
117
124
|
}
|
125
|
+
|
126
|
+
it: "fetches a value or calls a given alternative block" for: 'fetch:else: when: {
|
127
|
+
<['foo => 'bar]> fetch: 'foo else: { 42 } . is: 'bar
|
128
|
+
<['foo => 'bar]> fetch: 'unknown else: { 42 } . is: 42
|
129
|
+
<['nil => nil]> fetch: 'nil else: { 'not_found } . is: nil
|
130
|
+
<['nila => nil]> fetch: 'nil else: { 'not_found } . is: 'not_found
|
131
|
+
}
|
132
|
+
|
133
|
+
it: "returns an object with slots based on key-value pairs in Hash" for: 'to_object when: {
|
134
|
+
<[]> to_object slots empty? is: true
|
135
|
+
<['name => "Chris"]> to_object tap: @{
|
136
|
+
slots is: ['name]
|
137
|
+
name is: "Chris"
|
138
|
+
name: "New Name"
|
139
|
+
name is: "New Name"
|
140
|
+
}
|
141
|
+
<['a => "hello", 'b => "world"]> to_object tap: @{
|
142
|
+
slots size is: 2
|
143
|
+
slots includes?: 'a . is: true
|
144
|
+
slots includes?: 'b . is: true
|
145
|
+
a is: "hello"
|
146
|
+
b is: "world"
|
147
|
+
a: "world"
|
148
|
+
b: "hello"
|
149
|
+
a is: "world"
|
150
|
+
b is: "hello"
|
151
|
+
}
|
152
|
+
}
|
118
153
|
}
|
data/tests/html.fy
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require: "../lib/html"
|
2
|
+
|
3
|
+
FancySpec describe: HTML with: {
|
4
|
+
it: "generates an empty html string when initialized" when: {
|
5
|
+
HTML new to_s is: ""
|
6
|
+
}
|
7
|
+
|
8
|
+
it: "generates a simple html string" when: {
|
9
|
+
h = HTML new
|
10
|
+
h html: {
|
11
|
+
h head: {
|
12
|
+
h title: "Hello"
|
13
|
+
}
|
14
|
+
h body: {
|
15
|
+
h h1: "Hello, World!"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
h to_s is: \
|
20
|
+
"""<html>
|
21
|
+
<head>
|
22
|
+
<title>
|
23
|
+
Hello
|
24
|
+
</title>
|
25
|
+
</head>
|
26
|
+
<body>
|
27
|
+
<h1>
|
28
|
+
Hello, World!
|
29
|
+
</h1>
|
30
|
+
</body>
|
31
|
+
</html>"""
|
32
|
+
}
|
33
|
+
}
|
data/tests/kvo.fy
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require: "lib/kvo"
|
2
|
+
|
3
|
+
class Person {
|
4
|
+
include: KVO
|
5
|
+
read_write_slots: ('name, 'age, 'city, 'friends)
|
6
|
+
}
|
7
|
+
|
8
|
+
FancySpec describe: KVO with: {
|
9
|
+
before_each: {
|
10
|
+
@p = Person new tap: @{
|
11
|
+
name: "Tom"
|
12
|
+
age: 42
|
13
|
+
city: "Berlin"
|
14
|
+
friends: []
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
it: "observes slot changes as expected" when: {
|
19
|
+
name_changed = false
|
20
|
+
new_name = nil
|
21
|
+
old_name = nil
|
22
|
+
@p observe: 'name with: |new old| {
|
23
|
+
new_name = new
|
24
|
+
old_name = old
|
25
|
+
name_changed = true
|
26
|
+
}
|
27
|
+
|
28
|
+
city_changed = false
|
29
|
+
new_city = nil
|
30
|
+
old_city = nil
|
31
|
+
@p observe: 'city with: |new old| {
|
32
|
+
new_city = new
|
33
|
+
old_city = old
|
34
|
+
city_changed = true
|
35
|
+
}
|
36
|
+
|
37
|
+
@p name: "Hello"
|
38
|
+
name_changed is: true
|
39
|
+
new_name is: "Hello"
|
40
|
+
old_name is: "Tom"
|
41
|
+
@p name is: new_name
|
42
|
+
|
43
|
+
@p age: 24
|
44
|
+
@p age is: 24
|
45
|
+
|
46
|
+
@p city: "Hamburg"
|
47
|
+
city_changed is: true
|
48
|
+
new_city is: "Hamburg"
|
49
|
+
old_city is: "Berlin"
|
50
|
+
@p city is: new_city
|
51
|
+
}
|
52
|
+
|
53
|
+
it: "observes insertions to collections correctly" when: {
|
54
|
+
friend_added = false
|
55
|
+
new_friend = nil
|
56
|
+
@p observe_insertion: 'friends with: |f| {
|
57
|
+
friend_added = true
|
58
|
+
new_friend = f
|
59
|
+
}
|
60
|
+
|
61
|
+
@p friends << "Jack"
|
62
|
+
friend_added is: true
|
63
|
+
new_friend is: "Jack"
|
64
|
+
@p friends first is: "Jack"
|
65
|
+
|
66
|
+
@p friends << "Jimmy"
|
67
|
+
new_friend is: "Jimmy"
|
68
|
+
@p friends second is: "Jimmy"
|
69
|
+
}
|
70
|
+
|
71
|
+
it: "observes removals from collections correctly" when: {
|
72
|
+
@p friends << "Jack"
|
73
|
+
@p friends << "Jimmy"
|
74
|
+
|
75
|
+
@p friends is: ["Jack", "Jimmy"]
|
76
|
+
|
77
|
+
friend_removed = false
|
78
|
+
removed_friend = nil
|
79
|
+
@p observe_removal: 'friends with: |f| {
|
80
|
+
friend_removed = true
|
81
|
+
removed_friend = f
|
82
|
+
}
|
83
|
+
|
84
|
+
@p friends remove: "Jack"
|
85
|
+
friend_removed is: true
|
86
|
+
removed_friend is: "Jack"
|
87
|
+
@p friends remove: "Jimmy"
|
88
|
+
removed_friend is: "Jimmy"
|
89
|
+
|
90
|
+
@p friends << "Jack"
|
91
|
+
@p friends << "Jimmy"
|
92
|
+
@p friends remove_at: 0
|
93
|
+
removed_friend is: "Jack"
|
94
|
+
@p friends first is: "Jimmy"
|
95
|
+
|
96
|
+
@p friends << "Jack"
|
97
|
+
@p friends << "Tom"
|
98
|
+
@p friends remove_at: (0,1)
|
99
|
+
@p friends is: ["Tom"]
|
100
|
+
}
|
101
|
+
}
|
data/tests/number.fy
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
FancySpec describe: Number with: {
|
2
|
+
it: "returns an array from 0 upto 10" with: 'upto: when: {
|
3
|
+
0 upto: 10 . is: [0,1,2,3,4,5,6,7,8,9,10]
|
4
|
+
}
|
5
|
+
|
6
|
+
it: "iterates from 1 upto 10" with: 'upto:do: when: {
|
7
|
+
sum = 0
|
8
|
+
1 upto: 10 do: |n| { sum = sum + n }
|
9
|
+
sum is: 55
|
10
|
+
}
|
11
|
+
|
12
|
+
it: "iterates from 1 upto 20 in steps of 4" when: {
|
13
|
+
sum = 0
|
14
|
+
1 upto: 20 in_steps_of: 4 do: |n| {
|
15
|
+
sum = sum + n
|
16
|
+
}
|
17
|
+
sum is: $ [1,5,9,13,17] sum
|
18
|
+
}
|
19
|
+
|
20
|
+
it: "returns an array from 10 downto 0" with: 'downto: when: {
|
21
|
+
10 downto: 0 . is: [10,9,8,7,6,5,4,3,2,1,0]
|
22
|
+
}
|
23
|
+
|
24
|
+
it: "iterates from 10 downto 1" with: 'downto:do: when: {
|
25
|
+
sum = 0
|
26
|
+
10 downto: 1 do: |n| { sum = sum + n }
|
27
|
+
sum is: 55
|
28
|
+
}
|
29
|
+
|
30
|
+
it: "iterates from 20 downto 1 in steps of 4" when: {
|
31
|
+
sum = 0
|
32
|
+
20 downto: 1 in_steps_of: 4 do: |n| {
|
33
|
+
sum = sum + n
|
34
|
+
}
|
35
|
+
sum is: $ [0,4,8,12,16,20] sum
|
36
|
+
}
|
37
|
+
|
38
|
+
it: "is the square of self" with: 'squared when: {
|
39
|
+
5 squared is: 25
|
40
|
+
10 squared is: 100
|
41
|
+
20 upto: 50 do: |i| {
|
42
|
+
i squared is: (i * i)
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
it: "returns the cubed value of self" with: 'cubed when: {
|
47
|
+
5 cubed is: 125
|
48
|
+
10 cubed is: 1000
|
49
|
+
20 upto: 50 do: |i| {
|
50
|
+
i cubed is: (i * i * i)
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
it: "is the double value of self" with: 'doubled when: {
|
55
|
+
5 doubled is: 10
|
56
|
+
10 doubled is: 20
|
57
|
+
20 upto: 50 do: |i| {
|
58
|
+
i doubled is: (i + i)
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
it: "returns the maximum" with: 'max: when: {
|
63
|
+
0 max: 0 . is: 0
|
64
|
+
1 max: 2 . is: 2
|
65
|
+
2 max: 1 . is: 2
|
66
|
+
-2 max: -3 . is: -2
|
67
|
+
}
|
68
|
+
|
69
|
+
it: "returns the minimum" with: 'min: when: {
|
70
|
+
0 min: 0 . is: 0
|
71
|
+
-1 min: 0 . is: -1
|
72
|
+
-2 min: -3 . is: -3
|
73
|
+
2 min: 1 . is: 1
|
74
|
+
}
|
75
|
+
}
|