A session at Groovy and Grails eXchange 2013 investigating whether a language designed as a dynamic language really can be statically typed and compiled.
4. Copyright 息 2013 Russel Winder 4
Debate [d be t]肘 肘
n
1. (Government, Politics & Diplomacy) a formal discussion, as in a legislative
body, in which opposing arguments are put forward
2. discussion or dispute
3. (Philosophy) the formal presentation and opposition of a specific motion,
followed by a vote
vb
1. to discuss (a motion), esp in a formal assembly
2. to deliberate upon (something) he debated with himself whether to go
[from Old French debatre to discuss, argue, from Latin battuere]
debater n
Collins English Dictionary Complete and Unabridged 息 HarperCollins
Publishers 1991, 1994, 1998, 2000, 2003.
5. Copyright 息 2013 Russel Winder 5
foment [f m nt]
vb (tr)
1. to encourage or instigate (trouble, discord, etc.); stir up
2. (Medicine) Med to apply heat and moisture to (a part of the body) to relieve
pain and inflammation
[from Late Latin f ment re, from Latin f mentum a poultice, ultimately from
fov re to foster]
fomentation [ f m n te n] 肘 n
fomenter n
Usage: Both foment and ferment can be used to talk about stirring up trouble:
he was accused of fomenting/fermenting unrest. Only ferment can be used
intransitively or as a noun: his anger continued to ferment (not foment); rural
areas were unaffected by the ferment in the cities
Collins English Dictionary Complete and Unabridged 息 HarperCollins
Publishers 1991, 1994, 1998, 2000, 2003
6. Copyright 息 2013 Russel Winder 6
ferment
n [ f m nt]
1. (Life Sciences & Allied Applications / Biochemistry) any agent or substance,
such as a bacterium, mould, yeast, or enzyme, that causes fermentation
2. (Life Sciences & Allied Applications / Biochemistry) another word for
fermentation
3. commotion; unrest
vb [f m nt]
1. (Life Sciences & Allied Applications / Biochemistry) to undergo or cause to
undergo fermentation
2. to stir up or seethe with excitement
[from Latin fermentum yeast, from ferv re to seethe]
fermentable adj
fermentability n
fermenter n
Usage: See at foment
Collins English Dictionary Complete and Unabridged 息 HarperCollins
Publishers 1991, 1994, 1998, 2000, 2003
7. Copyright 息 2013 Russel Winder 7
The intention of this session is to
foment debate.
18. Copyright 息 2013 Russel Winder 18
Fortunately, Groovy decided to follow Smalltalk,
and have a meta-object protocol.
19. Copyright 息 2013 Russel Winder 19
Groovy is truly object-oriented,
message passing is the operational semantic,
and all variables are references to objects.
20. Copyright 息 2013 Russel Winder 20
x * y
transforms to
x.plus(y)
to realize message passing with method call.
26. Copyright 息 2013 Russel Winder 26
Adding types to parameters is required
for despatch by signature.
27. Copyright 息 2013 Russel Winder 27
static runtimeTyping(Number x, Number y) {
x * y
}
28. Copyright 息 2013 Russel Winder 28
Groovy is an optionally typed language:
variables, not just function and method
parameters, may or may not be given a type.
29. Copyright 息 2013 Russel Winder 29
Adding types works in harmony with
method overloading.
30. Copyright 息 2013 Russel Winder 30
All type checking is at run time.
This is harmonious with duck typing.
40. Copyright 息 2013 Russel Winder 40
A totally different view of how computation
proceeds: a different computational model.
41. Copyright 息 2013 Russel Winder 41
class ExpandoDynamic {
static void main(args) {
def x = new Expando()
x.multiply = { y -> x.data * y }
x.data = 'XX'
def y = 2
assert x * 2 == 'XXXX'
}
}
42. Copyright 息 2013 Russel Winder 42
@TypeChecked
class ExpandoStatic {
static void main(args) {
def x = new Expando()
x.multiply = { y -> x.data * y }
x.data = 'XX'
def y = 2
assert x * 2 == 'XXXX'
}
}
43. Copyright 息 2013 Russel Winder 43
Should a language support two disparate
computational models?
44. Copyright 息 2013 Russel Winder 44
final class Thing {
final x
Thing(x) { this.x = x }
Thing multiply(Thing y) { new Thing(x * y.x) }
boolean equals(Thing y) { x == y.x }
boolean equals (Object y) { x == y }
String toString() { x.toString() }
}
x = new Thing('XX')
y = new Thing(2)
z = new Thing(2.0)
assert x * y == 'XXXX'
assert x * y == new Thing('XXXX')
assert x * z == 'XXXX'
assert x * z == new Thing('XXXX')
assert y * z == 4.0
assert y * z == new Thing(4.0)
assert z * y == 4.0
assert z * y == new Thing(4.0)
45. Copyright 息 2013 Russel Winder 45
@TypeChecked
final class Thing {
final Integer x_i
final String x_s
Thing(Integer x) { this.x_i = x ; assert this.x_s == null }
Thing(String x) { this.x_s = x ; assert this.x_i == null }
Thing multiply(Thing y) {
if (x_i == null) { new Thing(StringGroovyMethods.multiply(x_s, (Number)y.x)) }
else { new Thing(x_i * y.x_i) }
}
Object getX() { x_i == null ? x_s : x_i }
boolean equals(Thing y) { x_i == null ? x_s == y.x_s : x_i == y.x_i }
boolean equals (Object y) { x == y }
String toString() { x.toString() }
}
x = new Thing('XX')
y = new Thing(2)
assert x * y == 'XXXX'
assert x * y == new Thing('XXXX')
46. Copyright 息 2013 Russel Winder 46
Should a language do one thing well?
47. Copyright 息 2013 Russel Winder 47
class Duck {
static main(args) {
def total = 1
def data = [2, 3]
try {
total += data.sum()
}
catch (MissingMethodException mme) {
total = 0
}
assert total == 6
}
}
48. Copyright 息 2013 Russel Winder 48
@TypeChecked
class NotDuck {
static void main(String[] args) {
Integer total = 1
List data = [2, 3]
total += (Integer)data.sum()
assert total == 6
}
}
49. Copyright 息 2013 Russel Winder 49
Should a language be all things
60. Copyright 息 2013 Russel Winder 60
foment [f m nt]
vb (tr)
1. to encourage or instigate (trouble, discord, etc.); stir up
2. (Medicine) Med to apply heat and moisture to (a part of the body) to relieve
pain and inflammation
[from Late Latin f ment re, from Latin f mentum a poultice, ultimately from
fov re to foster]
fomentation [ f m n te n] n 肘
fomenter n
Usage: Both foment and ferment can be used to talk about stirring up trouble:
he was accused of fomenting/fermenting unrest. Only ferment can be used
intransitively or as a noun: his anger continued to ferment (not foment); rural
areas were unaffected by the ferment in the cities
Collins English Dictionary Complete and Unabridged 息 HarperCollins
Publishers 1991, 1994, 1998, 2000, 2003
61. Copyright 息 2013 Russel Winder 61
ferment
n [ f m nt]
1. (Life Sciences & Allied Applications / Biochemistry) any agent or substance,
such as a bacterium, mould, yeast, or enzyme, that causes fermentation
2. (Life Sciences & Allied Applications / Biochemistry) another word for
fermentation
3. commotion; unrest
vb [f m nt]
1. (Life Sciences & Allied Applications / Biochemistry) to undergo or cause to
undergo fermentation
2. to stir up or seethe with excitement
[from Latin fermentum yeast, from ferv re to seethe]
fermentable adj
fermentability n
fermenter n
Usage: See at foment
Collins English Dictionary Complete and Unabridged 息 HarperCollins
Publishers 1991, 1994, 1998, 2000, 2003