small medium large xlarge

The latest version of the book is B5.0, released 22 days ago. If you've bought a PDF of the book and would like to upgrade it to this version (for free), visit your home page.

By default this page displays the errata for the latest version of the book. If you have a previous version, select it here:

If you've found a new error, please submit it.

  • Typo
  • Tech. error
  • Suggestion
  • Maybe next edition
  • Not a problem
  • Reported in: B5.0 (14-Aug-17)
#81947
PDF page: 13
Maybe a colon would be better to introduce a list in a sentence containing 5 commas. "Just by describing that picture, we’ve identified four main e...more...
  • Reported in: B5.0 (14-Aug-17)
#81948
PDF page: 18
Apostrophe "confusion" in a couple of places at the beginning of the page: "Now lets’ add coordinate2 to the hits set as well." → "Now let’s add co...more...
  • Reported in: B5.0 (13-Aug-17)
#81946
PDF page: 26
Additional rationale for using a Map to represent the Board: the guarantee of key uniqueness prevents 2 islands of the same type from being added to t...more...
  • Reported in: B5.0 (14-Aug-17)
#81949
PDF page: 29
There are a couple of places on this page where the "?" is missing from a function name: "There’s a great function to test for this, MapSet.disjoin...more...
  • Reported in: B5.0 (05-Aug-17)
#81928
PDF page: 63

"iex> {:ok, rules} = Rules.check(rules, :no_win)" should be "iex> {:ok, rules} = Rules.check(rules, {:win_check, :no_win})--Yuan Li

  • Reported in: B5.0 (28-Jul-17)
  • Fixed: 29-Jul-17, awaiting book release
#81891
PDF page: 79
2nd sentence under "Initializing GenServer State" heading: ".. the idea that we're starting a new game process get’s buried in the arguments." C...more...
Lance Halvorsen says: Thanks!
  • Reported in: B5.0 (28-Jul-17)
  • Fixed: 29-Jul-17, awaiting book release
#81892
PDF page: 79

In the phrase, "To do this we’ll follow the GenServer pattern", add a comma, e.g.:

"To do this, we’ll follow the GenServer pattern"--Anthony Collen

Lance Halvorsen says: Thanks!
  • Reported in: B5.0 (02-Aug-17)
  • Fixed: 02-Aug-17, awaiting book release
#81914
PDF page: 83
:no_win won't match with any funciton defined, needs to be the tuple { :win_check, :no_win } iex> ​​ ​​ {:ok, ​​ ​​ rules} ​​ ​​ = ​​ ​​ Rules.chec...more...
Lance Halvorsen says: Thanks!
  • Reported in: B5.0 (11-Aug-17)
#81944
PDF page: 84

iex> Game.demo_call(game) instead of Game.call_demo(game) at the third line from the bottom of the page.--Iljun Kim

  • Reported in: B5.0 (02-Aug-17)
  • Fixed: 02-Aug-17, awaiting book release
#81915
PDF page: 88
In order to get {:error, :invalid_coordinate} on page 88 from the code Game.position_island(game, :player1, :l_shape, 10, 10) the new function on pa...more...
Lance Halvorsen says: Thanks, but the error case will already be a tuple.
  • Reported in: B5.0 (02-Aug-17)
#81917
Paper page: 89
I think the method ``def set_islands(game, player) when player in @players, do: GenServer.call(game, {:set_islands, player}) should be defined be...more...
  • Reported in: B5.0 (02-Aug-17)
#81916
PDF page: 107
Position Islands on GenServer def ​ position_island(game, player, key, row, col) ​ when ​ player ​ in ​ @players, ​ do ​: ​ GenServer.call(game, {​...more...
  • Reported in: B5.0 (02-Aug-17)
#81918
PDF page: 109
on the game.ex on page 109 we are using: ​ ​ board = player_board(state_data, player), then on page 110 we are using iex to test, but player_board is...more...
  • Reported in: B5.0 (03-Aug-17)
#81923
PDF page: 112
@players isn't defined yet. This is related with reported error #81916 ​ def ​ set_islands(game, player) ​ when ​ player ​ in ​ @players, ​ do ​: ...more...
  • Reported in: B5.0 (01-Aug-17)
  • Fixed: 02-Aug-17, awaiting book release
#81913
PDF page: 117

"it created a new Application for us with it’s own identity, above Phoenix itself"

it's -> its--Mark Wilbur

Lance Halvorsen says: Thanks!
  • Reported in: B5.0 (04-Aug-17)
#81925
PDF page: 124
On the text refers: Notice that we’re pattern matching for a successful start of the game server {:ok, _pid} = Supervisor.start_child(:game_super...more...