]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/phoenix/doc/starter_kit/values.qbk
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / phoenix / doc / starter_kit / values.qbk
CommitLineData
7c673cae
FG
1[/==============================================================================
2 Copyright (C) 2001-2010 Joel de Guzman
3 Copyright (C) 2001-2005 Dan Marsden
4 Copyright (C) 2001-2010 Thomas Heller
5
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8===============================================================================/]
9
10[section Values]
11
12Values are functions! Examples:
13
14 val(3)
15 val("Hello, World")
16
17The first evaluates to a nullary function (a function taking no arguments) that
18returns an `int`, `3`. The second evaluates to a nullary function that returns
19a `char const(&)[13]`, `"Hello, World"`.
20
21[heading Lazy Evaluation]
22
23Confused? `val` is a unary function and `val(3)` invokes it, you say?
24Yes. However, read carefully: /"evaluates to a nullary function"/.
25`val(3)` evaluates to (returns) a nullary function. Aha! `val(3)`
26returns a function! So, since `val(3)` returns a function, you can
27invoke it. Example:
28
29 std::cout << val(3)() << std::endl;
30
31(See [@../../example/values.cpp values.cpp])
32
33[blurb __tip__ Learn more about values [link phoenix.modules.core.values here.]]
34
35The second function call (the one with no arguments) calls the nullary function
36which then returns `3`. The need for a second function call is the reason why
37the function is said to be [*/Lazily Evaluated/]. The first call doesn't do
38anything. You need a second call to finally evaluate the thing. The first call
39lazily evaluates the function; i.e. doesn't do anything and defers the evaluation
40for later.
41
42[heading Callbacks]
43
44It may not be immediately apparent how lazy evaluation can be useful by just
45looking at the example above. Putting the first and second function call in a
46single line is really not very useful. However, thinking of `val(3)` as a
47callback function (and in most cases they are actually used that way), will make
48it clear. Example:
49
50 template <typename F>
51 void print(F f)
52 {
53 cout << f() << endl;
54 }
55
56 int
57 main()
58 {
59 print(val(3));
60 print(val("Hello World"));
61 return 0;
62 }
63
64(See [@../../example/callback.cpp callback.cpp])
65
66[endsect]
67