aboutsummaryrefslogtreecommitdiff
path: root/doc/codewalk/functions.xml
blob: db518dcc06c196a70a1890d90911cfc85228bdb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<codewalk title="First-Class Functions in Go">

<step title="Introduction" src="doc/codewalk/pig.go">
	Go supports first class functions, higher-order functions, user-defined
	function types, function literals, closures, and multiple return values.
  <br/><br/>

	This rich feature set supports a functional programming style in a strongly
	typed language.
	<br/><br/>

	In this codewalk we will look at a simple program that simulates a dice game
	called <a href="http://en.wikipedia.org/wiki/Pig_(dice)">Pig</a> and evaluates
	basic strategies.
</step>

<step title="Game overview" src="doc/codewalk/pig.go:/\/\/ A score/,/thisTurn int\n}/">
  Pig is a two-player game played with a 6-sided die.  Each turn, you may roll or stay.
	<ul>
		<li> If you roll a 1, you lose all points for your turn and play passes to
			your opponent.  Any other roll adds its value to your turn score.  </li>
		<li> If you stay, your turn score is added to your total score, and play passes
			to your opponent.  </li>
	</ul>
	
	The first person to reach 100 total points wins.
	<br/><br/>

	The <code>score</code> type stores the scores of the current and opposing
	players, in addition to the points accumulated during the current turn.
</step>

<step title="User-defined function types" src="doc/codewalk/pig.go:/\/\/ An action/,/bool\)/">
	In Go, functions can be passed around just like any other value. A function's
	type signature describes the types of its arguments and return values.
	<br/><br/>

	The <code>action</code> type is a function that takes a <code>score</code>
	and returns the resulting <code>score</code> and whether the current turn is
	over.
	<br/><br/>

  If the turn is over, the <code>player</code> and <code>opponent</code> fields
  in the resulting <code>score</code> should be swapped, as it is now the other player's
  turn.
</step>

<step title="Multiple return values" src="doc/codewalk/pig.go:/\/\/ roll returns/,/true\n}/">
	Go functions can return multiple values.  
	<br/><br/>

	The functions <code>roll</code> and <code>stay</code> each return a pair of
	values.  They also match the <code>action</code> type signature.  These
	<code>action</code> functions define the rules of Pig.
</step>

<step title="Higher-order functions" src="doc/codewalk/pig.go:/\/\/ A strategy/,/action\n/">
	A function can use other functions as arguments and return values.
	<br/><br/>

  A <code>strategy</code> is a function that takes a <code>score</code> as input
  and returns an <code>action</code> to perform.  <br/>
  (Remember, an <code>action</code> is itself a function.)
</step>

<step title="Function literals and closures" src="doc/codewalk/pig.go:/return func/,/return roll\n\t}/">
	Anonymous functions can be declared in Go, as in this example.  Function
	literals are closures: they inherit the scope of the function in which they
	are declared.
	<br/><br/>

	One basic strategy in Pig is to continue rolling until you have accumulated at
	least k points in a turn, and then stay.  The argument <code>k</code> is
	enclosed by this function literal, which matches the <code>strategy</code> type
	signature.
</step>

<step title="Simulating games" src="doc/codewalk/pig.go:/\/\/ play/,/currentPlayer\n}/">
  We simulate a game of Pig by calling an <code>action</code> to update the
  <code>score</code> until one player reaches 100 points.  Each
  <code>action</code> is selected by calling the <code>strategy</code> function
  associated with the current player.
</step>

<step title="Simulating a tournament" src="doc/codewalk/pig.go:/\/\/ roundRobin/,/gamesPerStrategy\n}/">
	The <code>roundRobin</code> function simulates a tournament and tallies wins.
	Each strategy plays each other strategy <code>gamesPerSeries</code> times.
</step>
	
<step title="Variadic function declarations" src="doc/codewalk/pig.go:/\/\/ ratioS/,/string {/">
	Variadic functions like <code>ratioString</code> take a variable number of
	arguments.  These arguments are available as a slice inside the function.
</step>

<step title="Simulation results" src="doc/codewalk/pig.go:/func main/,/\n}/">
	The <code>main</code> function defines 100 basic strategies, simulates a round
	robin tournament, and then prints the win/loss record of each strategy.
	<br/><br/>

	Among these strategies, staying at 25 is best, but the <a
	href="http://www.google.com/search?q=optimal+play+pig">optimal strategy for
	Pig</a> is much more complex.
</step>

</codewalk>