Errata
The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".
The following errata were submitted by our customers and approved as valid errors by the author or editor.
Color key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update
Version | Location | Description | Submitted By | Date submitted | Date corrected |
---|---|---|---|---|---|
vidi 9.2.2 |
"A function that takes a fun as an argument is called a higher-order function." Note from the Author or Editor: |
Marc van Woerkom | Aug 18, 2009 | ||
Other Digital Version | example files header |
It seems that all the example files downloaded |
F Fernandes | Aug 31, 2009 | |
1 1.3.1 |
You write: Note from the Author or Editor: |
Marc van Woerkom | Aug 15, 2009 | ||
Printed | Page 1 page 237 |
implementation of delete_usr function is missing Note from the Author or Editor: |
Anonymous | Sep 16, 2009 | |
3.3.6 4th & 5th code block |
4> io:format("the sum of ~w is ~w.~n", [[2,3,4],ioExs:sum([2,3,4])]). |
psykoTRON | Aug 04, 2009 | ||
Page 15 bottom paragraph |
The second sentence: The base is an integer between 2 and 16, ... |
Hynek Vychodil | Aug 14, 2009 | ||
Printed | Page 19 2nd Paragraph |
In the first paragraph of the "Atoms" section, erlang atoms are compared to "enums" in Ruby. However, I do not believe that Ruby has enums. I am an Erlang novice; however based on my experience working through the book's examples, Erlang atoms strike me as being very similar to Ruby *symbols*. Note from the Author or Editor: |
Jason Smith | Aug 31, 2009 | |
Printed | Page 19 Last paragraph |
Insert the sentence "Any atom containing a full stop will need to be quoted when typed in the Erlang shell." before the sentence "Pay special attention ..." |
Simon Thompson |
Apr 21, 2010 | |
Printed | Page 20, 378 378: list "Boolean Operators" allowed in guards |
I can not find a discussion of operator precedence in the Index. If the concept is called something else, I think it should also be indexed as "operator precedence" since erlang.org calls it that Note from the Author or Editor: |
Gene Tani | Oct 17, 2009 | |
Page 26 2nd code block |
1> [monday, tuesday, Wednesday]. |
Hynek Vychodil | Aug 15, 2009 | ||
Printed | Page 35 Line numbered 10 |
Replace line numbered 10 by |
Simon Thompson |
Apr 21, 2010 | |
Page 36 bottom |
3. pp36, Variable names, Name and Surname in command 15, Note from the Author or Editor: |
Francesco Cesarini |
Apr 12, 2010 | ||
Printed, PDF, , Other Digital Version | Page 36 bottom of page. |
15 {person, Name, Surname} = Var. |
psykoTRON | Jul 19, 2010 | |
Printed | Page 41 2nd full paragraph |
BEAM in fact stands for Bogdan's Erlang Abstract Machine, as it was devised by Bogumil (Bogdan) Hausman. In recent years Bjorn has taken on the implementation of the VM. Thanks to Bjarne Dacker for this correction. |
Simon Thompson |
Nov 21, 2009 | |
Printed | Page 44 Exercise 2.3 |
First paragraph of Exercise 2.3 says "Write a module boolean.erl..." while later references to the module say "bool:", not "boolean:" |
Alexei Nekrassov | Aug 07, 2009 | |
Page 44 Exercise 2-3 |
"Write a module boolean.erl that takes logical expressions and ..." |
Hynek Vychodil | Aug 16, 2009 | ||
Printed | Page 46 2nd paragraph of The case Construct |
The general case expression is illustrated in a wrong way. It should look like this: |
P.Tury | Sep 08, 2009 | |
Page 46 case pattern |
4. pp46, general case expression's form. TYPO Note from the Author or Editor: |
Anonymous | Apr 12, 2010 | ||
Page 48 1st code block, second line |
Code block contain guard expression and `when` keyword. The keyword has not been mentioned nor referenced in neighbor text. Guard section is just two pages ahead but it can be minor hitch for newcomers to language. (Example code would work well without guards even it would not be perfect.) Note from the Author or Editor: |
Hynek Vychodil | Aug 16, 2009 | ||
48 2nd to last paragraph |
The line: Note from the Author or Editor: |
psykoTRON | Jul 21, 2010 | ||
Page 49 Last para - "The if Construct" |
When explaining the 'if' construct, you illustrate the example with guard expressions numbered from 1..n and expressions numbered 1 to (unknown) - yet in the bottom line on that page you reuse the variable 'n' to illustrate that all expressions that match the 'Guard_i' expression will be executed. Under a strict reading, using conventional matrix math notation, one might interpret that to assume that only as many expressions will be evaluated as there are guard conditions (since the variable 'n' is reused). It'd be better to use the conventional "m x n" notation - i.e. Guard_1 .. Guard_m, and expression_1 .. expression_n. Note from the Author or Editor: |
Anonymous | Sep 08, 2009 | ||
Printed | Page 51 para -2 |
The guard(X,Y) example is somewhat in isolation, is not clarified or explained further. I assumed (wrongly), that I could use 'and' and 'or' constructs in a guard statement. The caveat in para -2 is clear, but does not list what is allowed, nor define 'user-defined' functions. Note from the Author or Editor: |
Dave Pawson |
Jul 24, 2009 | |
Printed | Page 51 Last but one paragraph |
The name of the example 'guard' function is very confusing. Erlang newbies just want to understand here what are 'guards'. This naming here confuses them suggesting that guards are some functions (with the name 'guard'...!?) Note from the Author or Editor: |
P.Tury | Sep 08, 2009 | |
Printed | Page 56 Last paragraph |
Once it mentiones 'now/1' instead of 'now/0'. |
P.Tury | Sep 08, 2009 | |
Printed, PDF, , Other Digital Version | Page 63 Tail-Recursive Functions, second code snippet |
Missing closing parenthesis. Note from the Author or Editor: |
Roberto Aloi | Aug 31, 2010 | |
Printed | Page 67 First sentence |
'This helper function takes two accumulators, one used to store the sum |
Ben North | Jul 17, 2009 | |
Printed | Page 69 last code section (7-4 lines from the bottom) |
The text refers to an error that can occur "when you match to retrieve parts of a result from a function call". Note from the Author or Editor: |
Alexei Nekrassov | Aug 09, 2009 | |
Printed, PDF, , Other Digital Version | Page 71 upper code block |
the upper try ... catch code block |
Simon Thompson |
Jul 31, 2010 | |
Page 72 Three lines from bottom. |
this line should read |
Simon Thompson |
Jun 20, 2009 | ||
Printed | Page 74 under "Using Catch" header |
"Richard Carlson" should be: "Richard Carlsson" |
Anonymous | Oct 30, 2009 | |
Printed | Page 81 3rd paragraph, 1st sentence |
Extra "now": "Now that we are now..." Note from the Author or Editor: |
Alexei Nekrassov | Aug 09, 2009 | |
Printed | Page 82-83 Bottom of 82, top of 83 |
The second part of exercise 3-1 is confusing: Note from the Author or Editor: |
ninaj | Aug 05, 2009 | |
Printed | Page 84 exercise 3-5 |
Hint: you will have to use a help function" => "helper" Note from the Author or Editor: |
Anonymous | Aug 31, 2009 | |
Printed | Page 90 Caution section at the bottom of the page |
The caution warns that the arguments passed to the spawn function have to be a list, and compares two code sections as follows: |
Lincoln Bryant | Jul 05, 2009 | |
Printed | Page 92 3rd paragraph from bottom |
"Guarantee not extended to messages sent from different processes"... Note from the Author or Editor: |
Gene tani | Sep 05, 2009 | |
Printed | Page 98 1st paragraph; last sentence |
"unbound variable DigitList in Figure 4-5" should refer to Figure 4-4 Note from the Author or Editor: |
Alexei Nekrassov | Aug 10, 2009 | |
Printed | Page 98 |
I think a diagram has gone astray from page 98. The fist para says, Note from the Author or Editor: |
Simon Thompson |
Jan 20, 2010 | |
Printed | Page 106 first code segment |
flush(), Note from the Author or Editor: |
Alexei Nekrassov | Aug 10, 2009 | |
Printed | Page 107 Last line of 'Benchmarking' section |
Last line of 'Benchmarking' section should not be bold |
Alexei Nekrassov | Aug 10, 2009 | |
Printed | Page 107 1st code example |
Line 11 of the code example says: Note from the Author or Editor: |
Ivan Uemlianin | Feb 23, 2010 | |
Printed | Page 114 'The Process Manager'; 2nd paragrpah; beginning of 3rd sentence |
Change 'Your can also redirect...' to 'You can also redirect...' |
Alexei Nekrassov | Aug 11, 2009 | |
Printed | Page 123 para 2 |
"where Frequencies is the loop data containing a tuple of allocated and available frequencies" |
Dave Pawson |
Aug 26, 2009 | |
Printed | Page 123 Paragraph beginning "Deallocation works in a similar way." |
replace |
Simon Thompson |
Apr 21, 2010 | |
Printed | Page 125 Last code example |
The module in this example is called "server", but there is a call to spawn/3 with "generic_handler" as the module name. This can be found on page 125, last line. Note from the Author or Editor: |
Dirceu Pereira Tiegs | Aug 03, 2009 | |
Printed | Page 126 explanation of the code, first bullet |
"state variable" at the end of the sentence should be corrected to "State variable", with "State" in typewriter font |
Simon Thompson |
Apr 21, 2010 | |
Printed | Page 134 1st paragraph |
Line that reads "Pay particular attention to the send_event/2 call" should read "Pay particular attention to the event/2 call". |
pnye | Jul 22, 2009 | |
Printed | Page 146 subsection "the exit BIFS" |
isn't the Pid in the exit signal,{'EXIT', Pid, Reason}, generated by exit/2 the pid of the exit/2 caller? (based on Joe Armstrong's book page 155 and my own experiment) Note from the Author or Editor: |
ssyeoh | Aug 20, 2009 | |
Printed | Page 146 Figure 6-7 |
In your comment to ssyeoh: Note from the Author or Editor: |
Alexei Nekrassov | Oct 07, 2009 | |
Printed | Page 148 Sentence just before table 6-1 |
Change |
Alexei Nekrassov | Oct 07, 2009 | |
Printed | Page 150 code section |
in init() function, process_flag line should be indented. Note from the Author or Editor: |
Ivan Uemlianin | Apr 18, 2010 | |
Printed | Page 151 loop(Frequencies) function |
'EXIT' block should be indented. Note from the Author or Editor: |
Ivan Uemlianin | Apr 18, 2010 | |
Printed, PDF, , Other Digital Version | Page 151 deallocate function |
allocate can allocate multiple frequencies per client, deallocate deallocates only one and always unlink the pid. This way if you allocate two frequencies and deallocate one, client and server will be unlinked. deallocate should check it's going to delete the last allocate frequency for that client. Note from the Author or Editor: |
Federico Galassi | Aug 21, 2010 | |
Printed | Page 153 Last paragraph |
"the synchronous client function stop/0" should be changed to "the synchronous client function stop/1" |
Andrey Paramonov | Nov 16, 2009 | |
Printed | Page 154 First sentence of "Exercise 6-2: A Reliable Mutex Semaphore" |
The sentence is referring to "...the mutex semaphore from the section "Finite State Machines on page 126 in Chapter 5..." I believe the mutex semaphore in question is on page 129 (description) or 130 (code and diagram). Note from the Author or Editor: |
ninaj | Aug 17, 2009 | |
Printed | Page 154 Erercise 6-2 |
try .. catch will not add anything here, as we are trapping exits. link will work, and an exit signal with reason noproc will be sent to the process. Note from the Author or Editor: |
Francesco Cesarini |
Sep 21, 2009 | |
Printed | Page 155 Second bullet point, last sentence |
I am just a bit confused about the instruction in exercise 6.3. In the second bullet point, I am to "remove the child from the child list if the module is not available". However, I would have thought that if something went wrong on line 22 of my_supervisor.erl, it would not have been added to the list, so there is nothing to remove? Note from the Author or Editor: |
ninaj | Aug 18, 2009 | |
Printed | Page 155 First bullet point of exercise 6-3 |
"If a child terminates both normally and abnormally" |
Ivan Uemlianin | Apr 18, 2010 | |
Printed | Page 156 Fourth bulletpoint, second sentence |
The sentence reads "You will get pid from the return value of the start_child function." There is no start_child function though, it should probably be one of restart_child or start_children. Note from the Author or Editor: |
ninaj | Aug 18, 2009 | |
Page 158 Second line of the code for the tuples1 example |
This line should be |
Simon Thompson |
Jun 20, 2009 | ||
Printed | Page 159 definition of record |
Wrong bracket type, brackets missing, full stop missing: |
Ivan Uemlianin | May 03, 2010 | |
Printed | Page 167 second line |
The "call" in "the second call will be..." should be corrected to "Call" in typewriter font. |
Simon Thompson |
Apr 21, 2010 | |
Printed | Page 169 Excercise 7-3, line 3 |
-record{data,{key,data}). |
ninaj | Aug 20, 2009 | |
Printed | Page 169 1st paragraph |
Exercise 7-2 introduces the BIF record/2 - this should probably be changed to is_record/2, as the current erlang release (R13X) deprecates record/2 (the compiler issues a warning): Note from the Author or Editor: |
Tom Regner | Sep 21, 2009 | |
Printed | Page 169 Exercise 7-2, top of page |
"Using the record BIF record(P, person)..." |
Steven Wicklund | May 11, 2010 | |
Page 178 Shell statement numbers 5 and 6 |
The shell statement numbers 5 and 6 indicate that the user is to continue their shell session. However, executing these commands in the same shell session results in an error. Note from the Author or Editor: |
Phil Jerkins | Aug 18, 2009 | ||
Printed | Page 187 Paragraph numbered "2" |
"2. Add the client function code_upgrade() to the my_db.erl server module." Note from the Author or Editor: |
ninaj | Aug 23, 2009 | |
Printed, PDF, , Other Digital Version | Page 194 Note at the middle of the page |
The note at the middle of the page states you can't spawn a dynamically created function, and gives no example. But at least with R14A it seems you can, also closures with bound values can be spawned. Note from the Author or Editor: |
Nahuel Greco | Aug 01, 2010 | |
Printed | Page 195 code of foo() function |
The third line "Bump = fun(X) -> X+1 end." should be corrected |
Simon Thompson |
Apr 21, 2010 | |
Printed | Page 197 top of the page, shell entry 18> |
Technically speaking, this is not definition of positive function, it's a definition of non-negative function. In that regard the "true" result of lists:all(Positive, [0,1,2,3,4]) in shell line 20 might be misleading. Note from the Author or Editor: |
Andrey Paramonov | Nov 27, 2009 | |
Printed | Page 200 2nd paragraph, "multiple Generators" |
"next, X is given the value ___ and Y ranges through [2,3] |
gene tani | Aug 29, 2009 | |
Printed | Page 201 whole chapter |
The usage of the terms 'binaries' and 'bitstrings' is not consistent. Note from the Author or Editor: |
Paul Hoesli | Aug 02, 2009 | |
Page 204 Following the line "The following code snippet shows these types in action:" |
None of the code in this block should be italicised. |
Simon Thompson |
Jun 20, 2009 | ||
Printed | Page 205 second to last section |
The statement Note from the Author or Editor: |
Paul Hoesli | Aug 02, 2009 | |
Printed | Page 209 Figure 9-1 |
In the code snippet the comma is missing after 5th closing brace. The correct code is |
Andrey Paramonov | Nov 28, 2009 | |
Printed | Page 220 code snippet in 2nd paragraph |
regexp module is deprecated. The example should use re module. Also, the definition of Punctuation seems to be over-backslashed. It's not necessarily to escape space, comma, and (semi)column in regex patterns. Note from the Author or Editor: |
Andrey Paramonov | Nov 30, 2009 | |
Printed | Page 222 paragraph starting with "The traversal is set up..." |
Incorrect arity of prettyIndex and prettyIndexNext functions. They must be prettyIndex/0 and prettyIndexNext/2. Note from the Author or Editor: |
Andrey Paramonov | Dec 01, 2009 | |
Page 223 first block of code |
the first line of the code block should read |
Simon Thompson |
Jun 21, 2009 | ||
Page 237 10th line of first code block |
This line should read Note from the Author or Editor: |
Simon Thompson |
Jun 21, 2009 | ||
Page 248 3rd paragraph |
Missing space. Note from the Author or Editor: |
Mietek Bąk | Aug 19, 2009 | ||
Printed | Page 248 4th paragraph |
change "module dist.er1" (digit "one" at the end) to |
Alexei Nekrassov | Nov 19, 2009 | |
Page 255 2nd code listing |
Node name mix-up. |
Mietek Bąk | Aug 19, 2009 | ||
Printed | Page 260 under "epmd process" header, in italics |
3rd line of paragra[ph: "port mapper deamon" >> "daemon" |
gene tani | Aug 29, 2009 | |
Page 271 In the code block |
before the line |
Simon Thompson |
Jun 21, 2009 | ||
Printed | Page 276 4th and 5th paragraph |
supervisor:start/3 and supervisor:start/2 don't seem to exist. Note from the Author or Editor: |
Anonymous | Mar 07, 2010 | |
Printed, PDF, , Other Digital Version | Page 278 The paragraph headed "Restart" in the "Child Specification" section. |
The text describing child restart strategy transposes the meanings of 'temporary' and 'transient'. |
Tim Lewis | Aug 24, 2010 | |
Printed | Page 283 3rd paragraph, 5th row |
instead of inets.app should be *.app or app, Note from the Author or Editor: |
Anonymous | Sep 17, 2009 | |
Printed | Page 288 2nd paragraph |
Text refers to systools:make_rel(Name, Options) in the second sentence of the second paragraph and also in the next to the last sentence of the third paragraph. I think this should be systools:make_script/2. To the best of my knowledge, the Erlang error handler, and the most recent documentation, there is no systools:make_rel function. |
K5KDN | Oct 05, 2009 | |
Printed | Page 288 middle / bottom |
The function systools:make_rel(Name, Options) and systools:make_rel/2 is depreciated and should be replaced with systools:make_script(Name, Options) and systools:make_script/2 Note from the Author or Editor: |
Francesco Cesarini |
Sep 02, 2010 | |
Printed | Page 306 Command 4, line 3 |
{disc_copies [foo@localhost, bar@localhost}]). |
ninaj | Sep 02, 2009 | |
Printed | Page 326 last parag |
It should be noted that the 3 ways to specify IP address for gen_udp are not completely equivalent re: DNS lookups Note from the Author or Editor: |
gene tani | Oct 09, 2009 | |
Printed | Page 346 1st complete paragraph under "Erlang from Unix Shell" |
1st line of paragraph |
gene t | Oct 10, 2009 | |
Printed, PDF, , Other Digital Version | Page 351 lower half |
just the brackets missing at the when(..) and f.send!(...) and it works like a charm in ruby 1.8.7 with current gem of erlectricity |
Simon Thompson |
Mar 23, 2011 | |
Printed | Page 368 last paragraph |
Text says: "dbg:stop/0 will not clear the trace flags" Note from the Author or Editor: |
Andrey Paramonov | Dec 25, 2009 | |
Printed, PDF, , Other Digital Version | Page 392 4th and 5th paragraphs |
The first average fun is non-tail-recursive and the |
Anonymous | Oct 04, 2010 | |
Printed | Page 399 |
The book does not mention that to be able to use TypEr, you first have to create a Persistent Lookup Table with Dialyzer. Adding this information may be difficult, as TypEr is presented before Dialyzer. Note from the Author or Editor: |
Olaf Chitil | Sep 08, 2009 | |
Printed | Page 402, 404 footprint, bottom p 402, "@spec" paragraph, top p 404 |
Maybe it's premature to write -spec's, but it's mentioned multiple times, so could you give a reference for the "@spec" vs. "-spec" Note from the Author or Editor: |
gene tani | Oct 10, 2009 | |
Printed, PDF, , Other Digital Version | Page 410 first line |
"y" should be replaced by "Figure 18-3" |
Simon Thompson |
Jun 29, 2010 | |
Printed | Page 424 1st paragraph |
compile:file(foo, [compile_all, ...]). |
Roberto Aloi | Nov 26, 2009 | |
Printed | Page 428 2nd paragraph |
The text warns that if you do not handle unknown messages, "you will notice that the CPU usage of your system will start to increase and that the response time will decrease". The explanation is that Erlang will have to traverse an increasing amount of messages waiting in the process's mailbox. But if that's the case, won't that increase the response time rather than decreasing it? Decreasing the response time means Erlang will perform faster rather than slower... Note from the Author or Editor: |
Rob Walker | Sep 08, 2010 | |
Printed | Page 451 Index |
<= (less than or equal to) operator, 28, 378 Note from the Author or Editor: |
Anonymous | Apr 12, 2010 | |
Printed | Page 469 1st column; 8th and 9th lines from the bottom |
Tiring test, 340 |
Alexei Nekrassov | Aug 01, 2009 |