Skip to content

Commit 438f0c4

Browse files
authored
Merge pull request #104 from jasalt/master
Improvement on control flow docs
2 parents b53d4b9 + 82e9913 commit 438f0c4

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

content/documentation/control-flow.md

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ A control flow structure. First evaluates _test_. If _test_ evaluates to `true`,
1414
The _test_ evaluates to `false` if its value is `false` or equal to `nil`. Every other value evaluates to `true`. In sense of PHP this means (`test != null && test !== false`).
1515

1616
```phel
17-
(if true 10) # evaluates to 10
18-
(if false 10) # evaluates to nil
19-
(if true (print 1) (print 2)) # prints 1 but not 2
20-
(if 0 (print 1) (print 2)) # prints 2
21-
(if nil (print 1) (print 2)) # prints 2
22-
(if [] (print 1) (print 2)) # prints 2
17+
(if true 10) # Evaluates to 10
18+
(if false 10) # Evaluates to nil
19+
(if true (print 1) (print 2)) # Prints 1 but not 2
20+
(if 0 (print 1) (print 2)) # Prints 2
21+
(if nil (print 1) (print 2)) # Prints 2
22+
(if [] (print 1) (print 2)) # Prints 2
2323
```
2424

2525
## Case
@@ -95,20 +95,20 @@ Internally `recur` is implemented as a PHP while loop and therefore prevents the
9595
(foreach [value valueExpr] expr*)
9696
(foreach [key value valueExpr] expr*)
9797
```
98-
The `foreach` special form can be used to iterate over all kind of PHP datastructures. The return value of `foreach` is always `nil`. The `loop` special form should be preferred of the `foreach` special form whenever possible.
98+
The `foreach` special form can be used to iterate over all kind of PHP datastructures for side-effects. The return value of `foreach` is always `nil`. The `loop` special form should be preferred of the `foreach` special form whenever possible.
9999

100100
```phel
101101
(foreach [v [1 2 3]]
102-
(print v)) # prints 1, 2 and 3
102+
(print v)) # Prints 1, 2 and 3
103103
104104
(foreach [k v {"a" 1 "b" 2}]
105105
(print k)
106-
(print v)) # prints "a", 1, "b" and 2
106+
(print v)) # Prints "a", 1, "b" and 2
107107
```
108108

109109
## For
110110

111-
A more powerful loop functionality is provided by the `for` loop. The `for` loop is an elegant way to define and create arrays based on existing collections. It combines the functionality of `foreach`, `let` and `if` in one call.
111+
A more powerful loop functionality is provided by the `for` loop. The `for` loop is an elegant way to define and create arrays based on existing collections. It combines the functionality of `foreach`, `let`, `if` and `reduce` in one call.
112112

113113
```phel
114114
(for head body+)
@@ -130,6 +130,7 @@ have the form `:modifier argument`. The following modifiers are supported:
130130
* `:while` breaks the loop if the expression is falsy.
131131
* `:let` defines additional bindings.
132132
* `:when` only evaluates the loop body if the condition is true.
133+
* `:reduce [accumulator initial-value]` Instead of returning a list, it reduces the values into `accumulator`. Initially `accumulator` is bound to `initial-value`.
133134

134135
```phel
135136
(for [x :range [0 3]] x) # Evaluates to [0 1 2]
@@ -143,15 +144,26 @@ have the form `:modifier argument`. The following modifiers are supported:
143144
144145
(for [[k v] :pairs {:a 1 :b 2 :c 3}] [v k]) # Evaluates to [[1 :a] [2 :b] [3 :c]]
145146
(for [[k v] :pairs [1 2 3]] [k v]) # Evaluates to [[0 1] [1 2] [2 3]]
147+
(for [[k v] :pairs {:a 1 :b 2 :c 3} :reduce [m {}]]
148+
(put m k (inc v))) # Evaluates to {:a 2 :b 3 :c 4}
146149
147-
(for [x :in [2 2 2 3 3 4 5 6 6] :while (even? x)] x) # Evalutes to [2 2 2]
148-
(for [x :in [2 2 2 3 3 4 5 6 6] :when (even? x)] x) # Evalutaes to [2 2 2 4 6 6]
150+
(for [x :in [2 2 2 3 3 4 5 6 6] :while (even? x)] x) # Evaluates to [2 2 2]
151+
(for [x :in [2 2 2 3 3 4 5 6 6] :when (even? x)] x) # Evaluates to [2 2 2 4 6 6]
149152
150153
(for [x :in [1 2 3] :let [y (inc x)]] [x y]) # Evaluates to [[1 2] [2 3] [3 4]]
151154
152155
(for [x :range [0 4] y :range [0 x]] [x y]) # Evaluates to [[1 0] [2 0] [2 1] [3 0] [3 1] [3 2]]
153156
```
154157

158+
# Dofor
159+
160+
```
161+
(dofor [x :in [1 2 3]] (print x)) # Prints 1, 2, 3 and returns nil
162+
(dofor [x :in [2 3 4 5] :when (even? x)] (print x)) # Prints 1, 2 and returns nil
163+
```
164+
165+
Iterating over collections for side-effects is also possible with `dofor` which has similar behavior to `for` otherwise but returns `nil` as `foreach` does.
166+
155167
## Exceptions
156168

157169
```phel
@@ -169,11 +181,11 @@ The _expr_ is evaluated and thrown, therefore _expr_ must return a value that im
169181
All expressions are evaluated and if no exception is thrown the value of the last expression is returned. If an exception occurs and a matching _catch-clause_ is provided, its expression is evaluated and the value is returned. If no matching _catch-clause_ can be found the exception is propagated out of the function. Before returning normally or abnormally the optionally _finally-clause_ is evaluated.
170182

171183
```phel
172-
(try) # evaluates to nil
184+
(try) # Evaluates to nil
173185
174186
(try
175187
(throw (php/new \Exception))
176-
(catch \Exception e "error")) # evaluates to "error"
188+
(catch \Exception e "error")) # Evaluates to "error"
177189
178190
(try
179191
(+ 1 1)
@@ -182,7 +194,7 @@ All expressions are evaluated and if no exception is thrown the value of the las
182194
(try
183195
(throw (php/new \Exception))
184196
(catch \Exception e "error")
185-
(finally (print "test"))) # evaluates to "error" and prints "test"
197+
(finally (print "test"))) # Evaluates to "error" and prints "test"
186198
```
187199

188200
## Statements (do)

0 commit comments

Comments
 (0)