The Author Online Book Forums are Moving

The Author Online Book Forums will soon redirect to Manning's liveBook and liveVideo. All book forum content will migrate to liveBook's discussion forum and all video forum content will migrate to liveVideo. Log in to liveBook or liveVideo with your Manning credentials to join the discussion!

Thank you for your engagement in the AoF over the years! We look forward to offering you a more enhanced forum experience.

luke.bace (66) [Avatar] Offline
#1
Please post all errata here.
gmckinney (2) [Avatar] Offline
#2
Re: Errors and Corrections
5.4 is titled "Multimethod closures ..." while 5.4 is "ClosureProperty that looks like a method ..."
jbaruch (2) [Avatar] Offline
#3
Re: Errors and Corrections
Title of 2.3.7 "Using lists, maps, and ranges" comma before "and" is wrong
jbaruch (2) [Avatar] Offline
#4
Re: Errors and Corrections
Page 57 "funneling" should be "tunneling" probably
pmcneil (3) [Avatar] Offline
#5
Re: Errors and Corrections
Page 225 "Reuse by inheritance in questionable" *in* should be *is*
pmcneil (3) [Avatar] Offline
#6
Re: Errors and Corrections
pg 225 "If you have a superclass A with a subclass B than any object of class B is not only a B, it
also is an A!"

"than" should be "then"
balexand (1) [Avatar] Offline
#7
Re: Errors and Corrections
Listing 8.8 doesn't work
Mittie (397) [Avatar] Offline
#8
Re: Errors and Corrections
Hi,

which Groovy version are you using and what is the error message?

thanks
Dierk
bruceberk (3) [Avatar] Offline
#9
Re: Errors and Corrections
Page 292 - I think the Grape config filename/path is not correct.

Book has: ./groovy/grapeConfig.xml
Should be: .groovy/grapeConfig.xml
HamletDRC (6) [Avatar] Offline
#10
Re: Errors and Corrections
Thanks bruceberk. I'll update the chapter.
davicar (3) [Avatar] Offline
#11
Re: Errors and Corrections
Listing 3.6
I believe
assert "d" == /d/
Should be
assert "\d" == /d/

As is does not compile with 1.8.0
Mittie (397) [Avatar] Offline
#12
Re: Errors and Corrections
this appears to be a typesetting problem in the MEAP with doubled backslashes as it is ok in the source code, which is linked in.

Thanks for posting
Dierk
mado (2) [Avatar] Offline
#13
Re: Errors and Corrections
I dont see listings 8.8 or 8.2 for that matter. im using v9 of the second edition.
mado (2) [Avatar] Offline
#14
Re: Errors and Corrections
in page 208, following code was confusing to me. why are we calling invokeMethod when an object doesnt respond to the method name?

def groovyObjectInvoke(Object obj, String method, Object args){
if (obj instanceof GroovyInterceptable) {
return obj.metaClass.invokeMethod(method, args)
}
if (! obj.metaClass.respondsTo(method, args)) {
return obj.metaClass.invokeMethod(method, args)
}
obj.metaClass.invokeMethod(obj, method, args)
}
wim.deblauwe (17) [Avatar] Offline
#15
Re: Errors and Corrections
3.4.2 Working with GStrings

Listing 3.4 does not escape the $ dollar sign:

out = "my 0.02$"
assert out == 'my 0.02$'

Should be:

out = "my 0.02$"
assert out == 'my 0.02$'
wim.deblauwe (17) [Avatar] Offline
#16
Re: Errors and Corrections
3.5.2 Applying patterns

listing 3.7 does not run:

assert twister ==~ /(w+ w+)*/
| |
| false
she sells sea shells at the sea shore of seychelles
wim.deblauwe (17) [Avatar] Offline
#17
Re: Errors and Corrections
To make listing 3.7 run, use this:

assert twister ==~ /(w+ w+)*/

(notice the backslash before the 'w'

the definition of WORD has the same problem:

def WORD = /w+/

should be:

def WORD = /w+/
Mittie (397) [Avatar] Offline
#18
Re: Errors and Corrections
Hi mado,

yes, this looks wrong. I'll have a closer look into it.

Thanks a lot for posting
Dierk
Mittie (397) [Avatar] Offline
#19
Re: Errors and Corrections
exactly. Again typesetting dropped the backslash.

thanks for posting
Dierk
wim.deblauwe (17) [Avatar] Offline
#20
Re: Errors and Corrections
p.128: In the examples below, we use the it shortcut that refers to the item that is passed into the closure.

But, then the examples use 'item', not 'it'
wim.deblauwe (17) [Avatar] Offline
#21
Re: Errors and Corrections
p. 131 (quicksort)
In contrast to the simple description, we actually use three lists in rather than three.

Probably needs to be:

.. rather than two.
squash (2) [Avatar] Offline
#22
Re: Errors and Corrections
Page 31 - "In a way, overtures are the whole symphony en miniature."

You probably mean symphonic poem or opera. An overture is not associated with a symphony which is more often than not, composed of four movements.
Mittie (397) [Avatar] Offline
#23
Re: Errors and Corrections
Hi Squash,

touché, well spotted smilie

thanks for posting
Dierk
kurtg (4) [Avatar] Offline
#24
Re: Errors and Corrections
2.3.5 - AST is used long before it's explained later in the section.
kurtg (4) [Avatar] Offline
#25
Re: Errors and Corrections
2.4.3 The Groovy lifecycle

Groovy read *.groovy files can at runtime as if they were *.class files.

maybe should be:

Groovy read *.groovy files can [be executed?] at runtime as if they were *.class files.
kurtg (4) [Avatar] Offline
#26
Re: Errors and Corrections
3.2.2 Groovy is type-safe at runtime

p. 70 "Java enforces the type system to a large extend at compile time"

extend -> extent
Mittie (397) [Avatar] Offline
#27
Re: Errors and Corrections
thanks for your findings!

Dierk
madth3 (2) [Avatar] Offline
#28
Re: Errors and Corrections
Pages 8, 10 and 20 are numbered as 88, 1010 and 2020 respectively.
madth3 (2) [Avatar] Offline
#29
Re: Errors and Corrections
Not an error but something that caught my eye:

In the note in 1.2.3: As a mathematician, I had never seen the term "disassembly" to refer to prime factorization.
Mittie (397) [Avatar] Offline
#30
Re: Errors and Corrections
ok, thanks a lot!

Dierk
Corvin (7) [Avatar] Offline
#31
Re: Errors and Corrections
fulyl @ GROOVY.TRANSFORM.I MMUTABLE
lawrencewinkler (5) [Avatar] Offline
#32
Re: Errors and Corrections
Pages 51, 52, section 2.3.9

Text reference Listing 2.6, but the correct reference should probably be Listing 2.7
lawrencewinkler (5) [Avatar] Offline
#33
Re: Errors and Corrections
Listing 3.7, PDF rendering.

Comments in regex examples are truncated in both portrait and landscape orientations (on an iPad).
ygwilliams1 (1) [Avatar] Offline
#34
Re: Errors and Corrections
Within Chapter 3, all of the Table reference numbers are incorrect. All of the Table references begin with 1.*. Please see the references on pages 64, 65, 68, 74, 82, 8, 91, 93, 104 and 106, respectively.
kbw5666 (6) [Avatar] Offline
#35
Re: Errors and Corrections
Page 11:

println( [String,List,File]*.package.*name )

has an extra *, and should be instead:

println( [String,List,File]*.package.name )
kbw5666 (6) [Avatar] Offline
#36
Re: Errors and Corrections
Page 74, the pre and post decrement operators are missing their double minus signs in table 1.4
kbw5666 (6) [Avatar] Offline
#37
Re: Errors and Corrections
More missing backslash madness - one page 97, in listing 3.8, the comment
// words that end with 'ain': bw*ainb
probably should be:
// words that end with 'ain': w*ain

Likewise with the actual declaration of wordEnding & rhyme.
kbw5666 (6) [Avatar] Offline
#38
Re: Errors and Corrections
Section 4.1.3 is also missing '--' in the first bullet.

I'm going to assume from now on that all double dashes and backslashes are missing.
kbw5666 (6) [Avatar] Offline
#39
Re: Errors and Corrections
pg. 184, paragraph 3: "take to long" should be "take too long"
kbw5666 (6) [Avatar] Offline
#40
Re: Errors and Corrections
pg. 168, footnote 59: "happes" should be "happens"

Footnotes are showing up in-line in the Kindle reader on the iPad, rather than at the bottom of the page.
ksnortum (1) [Avatar] Offline
#41
Re: Errors and Corrections
About page 61, under "Groovy is Dynamic", the code snippet should be:

def code = '1 + '
code += System.getProperty('java.class.version')
assert code == '1 + 50.0'
assert 51.0 == evaluate(code)

...at least for Groovy 2.0.5.
mingk (5) [Avatar] Offline
#42
Re: Errors and Corrections
MEAP v12:

Page 85: "Note the difference in spelling in #1. This is not =~ b but a= ~b. Tricky."

Should be #2 instead of #1.
jncolin (7) [Avatar] Offline
#43
Re: Errors and Corrections
in listing 5.8 Investigating the closure scope, #7 is not working, because this.owner in the Closure refers to the declaring class and Mother class has no owner.
Exact message is:

Caught: groovy.lang.MissingPropertyException: No such property: owner for class: Mother
groovy.lang.MissingPropertyException: No such property: owner for class: Mother
at Mother$_birth_closure1.doCall(YAT2.groovy:45)
at YAT2.run(YAT2.groovy:5smilie
jncolin (7) [Avatar] Offline
#44
Re: Errors and Corrections
*** Problem found... *** Missed the inheritance between classes

Listing 5.10 The visitor pattern in Groovy does not work; the script fails with the following error

Caught: groovy.lang.MissingMethodException: No signature of method: Square.accept() is applicable for argument types: (YAT3$_run_closure1) values: [YAT3$_run_closure1@2ba99347]
Possible solutions: area(), grep(), inspect(), asType(java.lang.Class), inject(groovy.lang.Closure), sleep(long)
groovy.lang.MissingMethodException: No signature of method: Square.accept() is applicable for argument types: (YAT3$_run_closure1) values: [YAT3$_run_closure1@2ba99347]
Possible solutions: area(), grep(), inspect(), asType(java.lang.Class), inject(groovy.lang.Closure), sleep(long)
at Drawing$_accept_closure1.doCall(YAT3.groovy:36)
at Drawing.accept(YAT3.groovy:36)
at Drawing$accept.call(Unknown Source)
at YAT3.run(YAT3.groovy:66)

I'm not a Groovy expert, but it seems related to the use of this

Message was edited by:
jncolin
bodiam (27) [Avatar] Offline
#45
Re: Errors and Corrections
Hi Jncolin,

Thanks for reporting this! I have made the correction in the book: the 'this.' should be removed.

Erik Pragt
bodiam (27) [Avatar] Offline
#46
Re: Errors and Corrections
How did you execute the example in 5.10? I've executed it too using the Groovy Console 2.1.1, and I have no errors. My output is this:

The shapes in this drawing cover an area of 4.141592653589793 units.
The individual contributions are:
Square:1
Circle:3.141592653589793
Result: [Square@1835d850, Circle@770c789a]
jncolin (7) [Avatar] Offline
#47
Re: Errors and Corrections
as said in the update, I forgot to have Square and Circle extend the Shape class, hence the error. But I still can't get Listing 5.8 to work
bodiam (27) [Avatar] Offline
#48
Re: Errors and Corrections
Thanks mingk,

Good spot! I've made the correction!

Erik
bodiam (27) [Avatar] Offline
#49
Re: Errors and Corrections
Ah, I missed that. Can you try this code:

class Mother {
int field = 1
int foo(){
return 2
}
Closure birth (param) { //#1
def local = 3
def closure = { caller ->
[this, field, foo(), local, param, caller, owner]
}
return closure
}
}

Mother julia = new Mother()

closure = julia.birth(4) //#2

context = closure.call(this) //#3
println context[0].class.name //#4

assert context[1..4] == [1,2,3,4] //#5
assert context[5] instanceof Script //#6
assert context[6] instanceof Mother //#7

firstClosure = julia.birth(4) //#8
secondClosure = julia.birth(4) //#8
assert false == firstClosure.is(secondClosure) //#8

If it doesn't work, can you tell me how you execute the code, and using which version of Groovy?
jncolin (7) [Avatar] Offline
#50
Re: Errors and Corrections
Removing the this in the closure declaration works; there is still one issue though with #6
I stored the script in a file called YAT3 (Yet Another Test #3 smilie) so context[5] is not an instance of Script, but well of YAT3
bodiam (27) [Avatar] Offline
#51
Re: Errors and Corrections
I'm sorry, but if you don't answer my questions, it will be very hard to help you out here.

I've put the Groovy code in YAT3.groovy, and ran it using "groovy YAT3.groovy"

This produces the output: "Mother", so everything seems to work here.
jncolin (7) [Avatar] Offline
#52
Re: Errors and Corrections
I'm using groovy 2.1.1
jnc@alastor:~/Documents/workspace/GroovyTest/src$ groovy -v
Groovy Version: 2.1.1 JVM: 1.6.0_45 Vendor: Apple Inc. OS: Mac OS X

When I run the script, I get:
jnc@alastor:~/Documents/workspace/GroovyTest/src$ groovy YAT2
Mother
[1, 2, 3, 4]
YAT2
Mother

So as you can see, #6 says YAT2 instead of Script

Here's the code
class Mother {
int field = 1;
int foo() {
return 2;
}

Closure birth(param) {
def local = 3
def closure = { caller ->
[
this, // Mother
field,
foo(),
local,
param,
caller, // Script
owner //
]
}
return closure;
}
}

Mother julia = new Mother();
closure = julia.birth(4);
context = closure.call(this);
println context[0].class.name;
println context[1..4];
println context[5].class.name;
println context[6].class.name;
assert context[5] instanceof YAT2;
assert context[6] instanceof Mother;

firstClosure = julia.birth(4);
secondClosure = julia.birth(4);
assert false == firstClosure.is(secondClosure);
bodiam (27) [Avatar] Offline
#53
Re: Errors and Corrections
Hi jncolin,

I see what you mean, but I think you are mistaken here. While the class name is indeed YAT2, the context[5] is an instance of YAT2 and of Script, since YAT2 will extend Script.

That's why your script works. Though it might produce a bit different output than you would expect, since you placed it in a file, all the asserts still work, and both:

assert context[5] instanceof YAT2;
and
assert context[5] instanceof Script;

will work. Note btw that in your code, your are using a lot of semicolumns. This is very understandable coming from a Java background, but not needed!

Hope this answers your questions.

Erik Pragt
jncolin (7) [Avatar] Offline
#54
Re: Errors and Corrections
Hi Erik

Many thanks for these explanation.

Indeed, the semi columns come from my java tradition smilie

for the book, it might be useful to make explicit that scripts are expected to run in the console, otherwise, you'll end up with people like me who store them in files, and then face problem (in my case, the assert failed)

thanks again
bodiam (27) [Avatar] Offline
#55
Re: Errors and Corrections
Sure, no problem, but still I'm curious which assert failed, since it doesn't matter if you have:

assert context[5] instanceof YAT2;
or
assert context[5] instanceof Script;

When running them using 'groovy YAT2.groovy', both statements should work (and do, on my machine, though the output is

Mother
[1, 2, 3, 4]
YAT2
Mother

When running from a file, and

Mother
[1, 2, 3, 4]
ConsoleScript6
Mother

When running from the console.
jncolin (7) [Avatar] Offline
#56
Re: Errors and Corrections
I'm confused because now, I can't reproduce the assert that failed.. Sorry for bothering you.

Jean-Noël
bodiam (27) [Avatar] Offline
#57
Re: Errors and Corrections
Jean-Noël,

No problem at all, we're here to help! Thanks for the feedback anyway, and if you encounter any issues, just let us know.

Kind regards,

Erik Pragt
Kenshih (2) [Avatar] Offline
#58
Re: Errors and Corrections
MEAPv12
p.277 & 279 references to "listing 11.14" should be "listing 11.15"
Kenshih (2) [Avatar] Offline
#59
Re: Errors and Corrections
MEAPv12
Just a comment about 8.5.3:

After re-reading this section several times, I realized I just didn't know what was going on. The section mentions "IDE support", but I found it unclear what exact feature in the IDE (not to mention the mechanics of that feature) that this code was expected to provide. I felt I needed more context. Was this to enable code completion? If so, "how does an IDE do that" would be the context to provide, with specific-to-IDE vocabulary/nomenclature before entering the abstract generalization of input/output channels.

I mention it, because it stood out in contrast to the admirable level of clarity the rest of v12 has. Nice work, so far!
Ken
bodiam (27) [Avatar] Offline
#60
Re: Errors and Corrections
Thanks for the comments! It has been fixed!
adrien (1) [Avatar] Offline
#61
Re: Errors and Corrections
Hi
in Listing 4.1 Range declarations, the line

assert (0.0..1.0).contains(0.5)

fails.

thanks
Mittie (397) [Avatar] Offline
#62
Re: Errors and Corrections
Hi Adrian,

yes, it is a known breaking change from Groovy 1.5.

The "interval"-like contains method for ranges is now "containsWithinBounds".

Thanks for posting
Dierk
obecker (1) [Avatar] Offline
#63
Re: Errors and Corrections
XML release date, v14, Chapter 14 "Working with XML and JSON", page 348

The chapter says "The World Wide Web Consortium (W3C) standardized the first version of XML in 1996", which is technically not correct. Yes, the very first working draft dates back to 1996. However, the first "standard" (in W3C terms: "recommendation") was published in 1998.
http://www.w3.org/TR/1998/REC-xml-19980210
michael_m (4) [Avatar] Offline
#64
Re: Errors and Corrections
Chapter 13 (Database programming)
Page 299: The name is "Tanenbaum" (not Tennenbaum)
michael_m (4) [Avatar] Offline
#65
Re: Errors and Corrections
Chapter 13 (Database programming)
Use of supercede on Page 343, in the text, the example and the diagram.

From http://www.merriam-webster.com/dictionary/supercede:
Supercede has occurred as a spelling variant of supersede since the 17th century, and it is common in current published writing. It continues, however, to be widely regarded as an error.
jblack1395 (36) [Avatar] Offline
#66
Re: Errors and Corrections
The minus should be plus in listing 2.6
assert totalClinks == (partyPeople * (partyPeople-1))/2

1+2+3=6 but 3*2/2 = 3
paulk_asert (33) [Avatar] Offline
#67
Re: Errors and Corrections
Re: Tanenbaum. Corrected, thanks.
paulk_asert (33) [Avatar] Offline
#68
Re: Errors and Corrections
Re: Supercede: corrected, thanks
paulk_asert (33) [Avatar] Offline
#69
Re: Errors and Corrections
Re: 1996 vs 1998 for XML standardization. Corrected, thanks! We are implying the Recommendation so you are correct we should use the publication date.
bodiam (27) [Avatar] Offline
#70
Re: Errors and Corrections
@jblack1395

Not sure why you are saying that it should be +1, instead of -1.

If there are 2 people, there is one click: 2 * (2-1) / 2 = 2*1 /2 = 1
If there are 3 people, there are 3 clicks: 3 * (3-1) / 2 = 3*2 /2 = 3
If there are 4 people, there are 6 clicks: 4 * (4-1) / 2 = 4*3 /2 = 6

So, why should it be +1?
tdeleeuw (9) [Avatar] Offline
#71
Re: Errors and Corrections
Meap v14
Section 4.4 second paragraph there is a space between java. and util.Collection
tdeleeuw (9) [Avatar] Offline
#72
Re: Errors and Corrections
Meap v14
Some incorrect hyphenated words example
En-veloppe p 121
Well-p-erforming p122

The statement on page 123 that states that still a lot of Dev have to support 1.4, is (hopefully) not valid Anymore (Java 1.4.2 is end of life since Oct 2008 according to http://www.oracle.com/technetwork/java/javase/index-jsp-138567.html)
bodiam (27) [Avatar] Offline
#73
Re: Errors and Corrections
Hi Tdeleeuw,

Thanks for your feedback! It has been processed. I also found some other small errors in chapter 4, which are fixed now. I also checked chapter 5, and found many more dashes in words, which are fixed now.

Thanks again for reporting,

Erik Pragt
tdeleeuw (9) [Avatar] Offline
#74
Re: Errors and Corrections
Hi

Thanks for the "-" fixes smilie

When providing some samples, the lines are usually referenced using numbers, (#1, #2, ... in the MEAP v14) while for chapter 6, the lines are referenced by letters (#A, #B, ...)

This is of course rather cosmetic smilie

Best regards

Thierry
tdeleeuw (9) [Avatar] Offline
#75
Re: Errors and Corrections
Meap v14 page172
In block there is no spoon, "are classes" is repeated
bodiam (27) [Avatar] Offline
#76
Re: Errors and Corrections
Hi Thierry,

The reason for this is that number references come back in the text below, while letter references don't. And no, this is not a convention I thought of smilie If chapter 6 doesn't match this convention, we'll have to change it. Thanks for mentioning it.

I also fixed the 'are classes are classes'. Thanks again for the help, it's most appreciated!

Erik
tdeleeuw (9) [Avatar] Offline
#77
Re: Errors and Corrections
At least on page 173 of MEAP v 14, there are mention of both "missingMethod" and "methodMisssing" method names. The first term is likely incorrect and should be replaced by methodMissing.
paulk_asert (33) [Avatar] Offline
#78
Re: Errors and Corrections
Yes, there are several spots which need correcting. Thanks for your feedback.
biospringxyz (89) [Avatar] Offline
#79
Listing 9.19: Handwritten 'Copy Constructor' style cloning.
Field names are defined as:

String first name, last name

but the constructor (Person()) uses different spelling:

first = other.first
last = other.last

Hoon
bodiam (27) [Avatar] Offline
#80
Re: Listing 9.19: Handwritten 'Copy Constructor' style cloning.
Hello Hoon,

You're right, good spot!

It has been fixed now!

Thanks! Erik Pragt
biospringxyz (89) [Avatar] Offline
#81
Repeated "the" in the first sentence after Listing 9.21
As in:

"You can find the the @AutoExternalize behavior using the annotation parameters described in Appendix E."

Hoon
bodiam (27) [Avatar] Offline
#82
Re: Repeated "the" in the first sentence after Listing 9.21
Also fixed, plus I fixed another 'the the' reference. Thanks again!

Erik
biospringxyz (89) [Avatar] Offline
#83
Re: Errors and Corrections
Grammar error in the 2nd sentence of the paragraph right before Listing 9.22:

"For scripts, general script variables are in scope, and for classes instance field are in scope."

Should it read: "...for classes, instance fields are in scope"?
bodiam (27) [Avatar] Offline
#84
Re: Errors and Corrections
Hmm, it reads a bit weird indeed. I've added the comma and the s.
biospringxyz (89) [Avatar] Offline
#85
Re: Errors and Corrections
First sentence after Listing 9.22:

"As with all the Interrupt annotation, there are a variety of parameters"

Should it read:

"As with all the interrupt annotations, ..."?

Hoon
biospringxyz (89) [Avatar] Offline
#86
Re: Errors and Corrections
Not an error or anything but just a question: what drives the indentation style difference in some paragraphs? Some paragraphs start from the left edge of the text and some others after 4 spaces from the left edge as in (the last two paragraphs before 9.4 AST by Example:...):

"(4 spaces)When you write an AST transformation, you will need to decide which compiler phase to target. The choice depends on what you're trying to do to the AST. A full description of the different compiler phases, as well as some hints for choosing which phase to target, appears in Appendix F."
"(No spaces)Local transformations require an annotation,..."

Hoon
biospringxyz (89) [Avatar] Offline
#87
Re: Errors and Corrections
Spelling error: 1st sentence after Listing 9.27:

"Remember, free standing scripts without classes still get generated into a Script subclass during complication, so adding a getCompiledTime() method to..."

"complication" should read, "compilation"?

Hoon
bodiam (27) [Avatar] Offline
#88
Re: Errors and Corrections
This has also been fixed. I cannot answer your other question at this time, but I forwarded it to someone else of the team! Again, thanks for the great feedback!
biospringxyz (89) [Avatar] Offline
#89
Re: Errors and Corrections
Listing 9.28: the visit() method:

public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
(tab)List classes = sourceUnit.ast?.classes
(tab)classes.each { ClassNode clazz ->
(tab)(tab)clazz.addMethod(makeMethod())
(tab)}
}

Should the 1st line in the method read:

"List classes = sourceUnit.AST.classes"?

Hoon
biospringxyz (89) [Avatar] Offline
#90
Re: Errors and Corrections
Unwanted space in some words in Section 8.4.1, the gray box titled: "Calling a method means calling the meta class":

"As a r(space)ule of thumb you can assum(space)e that Groovy never calls..."

Hoon
biospringxyz (89) [Avatar] Offline
#91
Re: Errors and Corrections
Unwanted space and spelling error in the gray box titled, "For the geeks" in Section 8.4.1:

"...Then you can change it's default meta class by putting a m(space)eta class with the name "groovy.runtime.metaclass.custom.CustomMetaClass" on the classpath.
This device has b(space)een proven useful when inspecting large Groovy codebases in production...."

"it's" should read, "its"?

Hoon
biospringxyz (89) [Avatar] Offline
#92
Re: Errors and Corrections
Unwanted space in a word in the paragraph before Listing 8.14:

"If you have ever seen S(space)tanley Kubrick's motion picture..."
biospringxyz (89) [Avatar] Offline
#93
Re: Errors and Corrections
Section 8.4.6, gray box titled "Reuse by inheritance in questionable"

Did you mean to say, "Reuse by inheritance is questionable"?
biospringxyz (89) [Avatar] Offline
#94
Re: Errors and Corrections
Spelling error in paragraph before Listing 8.14:

"...you may remember the super-intelligent computer "HAL". I turns out that..."

Should "I turns out" read "It turns out"?

Hoon
biospringxyz (89) [Avatar] Offline
#95
Re: Errors and Corrections
Unwanted space in a word in the 4th bullet after Listing 8.17:

Meta classes allow non-intrusive... W(space)e can even change access..."

Hoon
biospringxyz (89) [Avatar] Offline
#96
Re: Errors and Corrections
Listing 8.18 4th line in the code:

(tab)Date xMas = janFirst1970 + 1.year - 8.days

fails to satisfy:

(tab)assert xMas.date == 24

by producing this message in IntelliJ:

Assertion failed:

assert xMas.date == 24
| | |
| 23 false
Wed Dec 23 19:00:00 EST 1970
biospringxyz (89) [Avatar] Offline
#97
Re: Errors and Corrections
Unwanted space in a word in the last sentence of the first paragraph after Listing 8.19:

"Third, they can easily be created in Groovy, Java, or a(space)ny other JVM..."

Hoon
biospringxyz (89) [Avatar] Offline
#98
Re: Errors and Corrections
The second sentence in the second paragraph in section 8.5:

"We will always start with explaining the task such that you can take it as ..."

Should it read, "We will always start with explaining the task so that you can take it as ..."?
biospringxyz (89) [Avatar] Offline
#99
Re: Errors and Corrections
The first sentence in section 8.5.1:

"...when calculating with measurements that have a different orders of magnitude."

"...a different orders of ..." sounds a bit strange due to the mix of singular and plural expressions one after another although the meaning is well conveyed.
biospringxyz (89) [Avatar] Offline
#100
Re: Errors and Corrections
The 2nd sentence of the 2nd paragraph in section 8.5.1:

"If we could simply write "1m + 20.cm - 8.mm"

"1m" should read, "1.m"?

Hoon