3 <!-- Generated by the Spirit (http://spirit.sf.net) QuickDoc -->
4 <title>Statements
</title>
5 <link rel=
"stylesheet" href=
"theme/style.css" type=
"text/css">
6 <link rel=
"prev" href=
"operators.html">
7 <link rel=
"next" href=
"binders.html">
10 <table width=
"100%" height=
"48" border=
"0" background=
"theme/bkd2.gif" cellspacing=
"2">
15 <font size=
"6" face=
"Verdana, Arial, Helvetica, sans-serif"><b>Statements
</b></font>
17 <td width=
"112"><a href=
"http://spirit.sf.net"><img src=
"theme/spirit.gif" align=
"right" border=
"0"></a></td>
23 <td width=
"30"><a href=
"../index.html"><img src=
"theme/u_arr.gif" border=
"0"></a></td>
24 <td width=
"30"><a href=
"operators.html"><img src=
"theme/l_arr.gif" border=
"0"></a></td>
25 <td width=
"20"><a href=
"binders.html"><img src=
"theme/r_arr.gif" border=
"0"></a></td>
28 <a name=
"lazy_statements"></a><h2>Lazy statements
</h2><p>
29 The primitives and composite building blocks presented before are sufficiently powerful to construct quite elaborate structures and facilities. We have presented lazy-functions and lazy-operators. How about lazy-statements? First, an appetizer:
</p>
31 Print all odd-numbered contents of an STL container using std::for_each (sample4.cpp):
</p>
33 <span class=identifier
>for_each
</span><span class=special
>(
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>begin
</span><span class=special
>(),
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>end
</span><span class=special
>(),
34 </span><span class=identifier
>if_
</span><span class=special
>(
</span><span class=identifier
>arg1
</span><span class=special
>%
</span><span class=number
>2 </span><span class=special
>==
</span><span class=number
>1</span><span class=special
>)
36 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>arg1
</span><span class=special
><< </span><span class=literal
>' '
37 </span><span class=special
>]
41 Huh? Is that valid C++? Read on...
</p>
43 Yes, it is valid C++. The sample code above is as close as you can get to the syntax of C++. This stylized C++ syntax differs from actual C++ code. First, the if has a trailing underscore. Second, the block uses square brackets instead of the familiar curly braces {}.
</p>
45 Here are more examples with annotations. The code almost speaks for itself.
</p>
47 <b>1) block statement:
</b></p>
49 <span class=identifier
>statement
</span><span class=special
>,
50 </span><span class=identifier
>statement
</span><span class=special
>,
52 </span><span class=identifier
>statement
55 Basically, these are comma separated statements. Take note that unlike the C/C++ semicolon, the comma is a separator put *in-between* statements. This is like Pascal's semicolon separator, rather than C/C++'s semicolon terminator. For example:
</p>
57 <span class=identifier
>statement
</span><span class=special
>,
58 </span><span class=identifier
>statement
</span><span class=special
>,
59 </span><span class=identifier
>statement
</span><span class=special
>, //
</span><span class=identifier
>ERROR
</span><span class=special
>!
62 Is an error. The last statement should not have a comma. Block statements can be grouped using the parentheses. Again, the last statement in a group should not have a trailing comma.
</p>
64 <span class=identifier
>statement
</span><span class=special
>,
65 </span><span class=identifier
>statement
</span><span class=special
>,
67 </span><span class=identifier
>statement
</span><span class=special
>,
68 </span><span class=identifier
>statement
69 </span><span class=special
>),
70 </span><span class=identifier
>statement
73 Outside the square brackets, block statements should be grouped. For example:
</p>
75 <span class=identifier
>for_each
</span><span class=special
>(
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>begin
</span><span class=special
>(),
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>end
</span><span class=special
>(),
77 </span><span class=identifier
>do_this
</span><span class=special
>(
</span><span class=identifier
>arg1
</span><span class=special
>),
78 </span><span class=identifier
>do_that
</span><span class=special
>(
</span><span class=identifier
>arg1
</span><span class=special
>)
83 <b>2) if_ statement:
</b></p>
85 We have seen the if_ statement. The syntax is:
</p>
87 <span class=identifier
>if_
</span><span class=special
>(
</span><span class=identifier
>conditional_expression
</span><span class=special
>)
89 </span><span class=identifier
>sequenced_statements
90 </span><span class=special
>]
93 <b>3) if_ else_ statement:
</b></p>
97 <span class=identifier
>if_
</span><span class=special
>(
</span><span class=identifier
>conditional_expression
</span><span class=special
>)
99 </span><span class=identifier
>sequenced_statements
100 </span><span class=special
>]
101 .
</span><span class=identifier
>else_
102 </span><span class=special
>[
103 </span><span class=identifier
>sequenced_statements
104 </span><span class=special
>]
107 Take note that else has a prefix dot and a trailing underscore: .else_
</p>
109 Example: This code prints out all the elements and appends
" > 5",
" ==
5" or
" < 5" depending on the element's actual value:
</p>
111 <span class=identifier
>for_each
</span><span class=special
>(
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>begin
</span><span class=special
>(),
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>end
</span><span class=special
>(),
112 </span><span class=identifier
>if_
</span><span class=special
>(
</span><span class=identifier
>arg1
</span><span class=special
>> </span><span class=number
>5</span><span class=special
>)
114 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>arg1
</span><span class=special
><< </span><span class=string
>" > 5\n
"
115 </span><span class=special
>]
116 .
</span><span class=identifier
>else_
117 </span><span class=special
>[
118 </span><span class=identifier
>if_
</span><span class=special
>(
</span><span class=identifier
>arg1
</span><span class=special
>==
</span><span class=number
>5</span><span class=special
>)
120 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>arg1
</span><span class=special
><< </span><span class=string
>" ==
5\n
"
121 </span><span class=special
>]
122 .
</span><span class=identifier
>else_
123 </span><span class=special
>[
124 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>arg1
</span><span class=special
><< </span><span class=string
>" < 5\n
"
125 </span><span class=special
>]
130 Notice how the if_ else_ statement is nested.
</p>
132 <b>4) while_ statement:
</b></p>
136 <span class=identifier
>while_
</span><span class=special
>(
</span><span class=identifier
>conditional_expression
</span><span class=special
>)
138 </span><span class=identifier
>sequenced_statements
139 </span><span class=special
>]
142 Example: This code decrements each element until it reaches zero and prints out the number at each step. A newline terminates the printout of each value.
</p>
144 <span class=identifier
>for_each
</span><span class=special
>(
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>begin
</span><span class=special
>(),
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>end
</span><span class=special
>(),
146 </span><span class=identifier
>while_
</span><span class=special
>(
</span><span class=identifier
>arg1
</span><span class=special
>--)
148 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>arg1
</span><span class=special
><< </span><span class=string
>",
"
149 </span><span class=special
>],
150 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>val
</span><span class=special
>(
</span><span class=string
>"\n
"</span><span class=special
>)
155 <b>5) do_ while_ statement:
</b></p>
159 <span class=identifier
>do_
160 </span><span class=special
>[
161 </span><span class=identifier
>sequenced_statements
162 </span><span class=special
>]
163 .
</span><span class=identifier
>while_
</span><span class=special
>(
</span><span class=identifier
>conditional_expression
</span><span class=special
>)
166 Again, take note that while has a prefix dot and a trailing underscore: .while_
</p>
168 Example: This code is almost the same as the previous example above with a slight twist in logic.
</p>
170 <span class=identifier
>for_each
</span><span class=special
>(
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>begin
</span><span class=special
>(),
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>end
</span><span class=special
>(),
172 </span><span class=identifier
>do_
173 </span><span class=special
>[
174 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>arg1
</span><span class=special
><< </span><span class=string
>",
"
175 </span><span class=special
>]
176 .
</span><span class=identifier
>while_
</span><span class=special
>(
</span><span class=identifier
>arg1
</span><span class=special
>--),
177 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>val
</span><span class=special
>(
</span><span class=string
>"\n
"</span><span class=special
>)
182 <b>6) for_ statement:
</b></p>
186 <span class=identifier
>for_
</span><span class=special
>(
</span><span class=identifier
>init_statement
</span><span class=special
>,
</span><span class=identifier
>conditional_expression
</span><span class=special
>,
</span><span class=identifier
>step_statement
</span><span class=special
>)
188 </span><span class=identifier
>sequenced_statements
189 </span><span class=special
>]
192 It is again almost similar to C++ for statement. Take note that the init_statement, conditional_expression and step_statement are separated by the comma instead of the semi- colon and each must be present (i.e. for_(,,) is invalid).
</p>
194 Example: This code prints each element N times where N is the element's value. A newline terminates the printout of each value.
</p>
196 <span class=keyword
>int
</span><span class=identifier
>iii
</span><span class=special
>;
197 </span><span class=identifier
>for_each
</span><span class=special
>(
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>begin
</span><span class=special
>(),
</span><span class=identifier
>c
</span><span class=special
>.
</span><span class=identifier
>end
</span><span class=special
>(),
199 </span><span class=identifier
>for_
</span><span class=special
>(
</span><span class=identifier
>var
</span><span class=special
>(
</span><span class=identifier
>iii
</span><span class=special
>) =
</span><span class=number
>0</span><span class=special
>,
</span><span class=identifier
>var
</span><span class=special
>(
</span><span class=identifier
>iii
</span><span class=special
>)
< </span><span class=identifier
>arg1
</span><span class=special
>, ++
</span><span class=identifier
>var
</span><span class=special
>(
</span><span class=identifier
>iii
</span><span class=special
>))
201 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>arg1
</span><span class=special
><< </span><span class=string
>",
"
202 </span><span class=special
>],
203 </span><span class=identifier
>cout
</span><span class=special
><< </span><span class=identifier
>val
</span><span class=special
>(
</span><span class=string
>"\n
"</span><span class=special
>)
208 As before, all these are lazily evaluated. The result of such statements are in fact composites that are passed on to STL's for_each function. In the viewpoint of for_each, what was passed is just a functor, no more, no less.
</p>
209 <table width=
"80%" border=
"0" align=
"center">
211 <td class=
"note_box">
212 <img src=
"theme/note.gif"></img> Unlike lazy functions and lazy operators, lazy statements always return void.
</td>
217 <td width=
"30"><a href=
"../index.html"><img src=
"theme/u_arr.gif" border=
"0"></a></td>
218 <td width=
"30"><a href=
"operators.html"><img src=
"theme/l_arr.gif" border=
"0"></a></td>
219 <td width=
"20"><a href=
"binders.html"><img src=
"theme/r_arr.gif" border=
"0"></a></td>
224 <p class=
"copyright">Copyright
© 2001-
2002 Joel de Guzman
<br>
226 <font size=
"2">Use, modification and distribution is subject to the Boost Software
227 License, Version
1.0. (See accompanying file LICENSE_1_0.txt or copy at
228 http://www.boost.org/LICENSE_1_0.txt)
</font> </p>