gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · a!aining grace in teaching...

123
Aaining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17 March 2016

Upload: others

Post on 31-Jul-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Attaining Grace

in Teaching Programming

James Noble

Andrew Black Kim Bruce

1 gracelang.org

Michael Homer

Thursday, 17 March 2016

Page 2: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Time for a New Language for Novices

Java nearly 20 years old, Python older

State of the art has advanced patches look like … patches

Too much overhead in popular languagespublic static void main(String[] args)

2

Thursday, 17 March 2016

Page 3: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace User ModelFirst year students in OO CS1 or CS2

objects early or late,

static or dynamic types,

functionals first or scripting first or …

Second year students

Faculty & TAs — assignments and libraries

Researchers wanting an experimental vehicle

Language Designers wanting a good example

3

Thursday, 17 March 2016

Page 4: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Goals Integrate proven new ideas in programming languages into a simple o-o language.

Gracefully represent key concepts underlying o-o programming in a way that can be easily explained.

Allow students to focus on the essential, rather than the accidental, difficulties of programming, problem solving and system modeling.

4

Thursday, 17 March 2016

Page 5: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

We are in the dog food business

User model:Beginning students

Customer: experienced instructors

The consumer is not the customer

5

Thursday, 17 March 2016

Page 6: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Fundamentals

Everything is an object

Simple dynamic method dispatch

Single inheritance

Types are interfaces (classes ≠ types)Types come after objects

Blocks are first-class closures

6

Thursday, 17 March 2016

Page 7: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Advanced Features

Pattern Matching

Extensible via Libraries (control & data) Modules as objects

Dialects to expand (vocabulary, not syntax) provide initialization, and restrict language (enforce constraints)

7

Thursday, 17 March 2016

Page 8: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

“Hello World” in Grace

8

Thursday, 17 March 2016

Page 9: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

“Hello World” in Grace

8

print "Hello World!"

Thursday, 17 March 2016

Page 10: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Java vs. Grace

9

public class Celsius {

public static double toCelsius(double f) { if (f < -459.4) { throw new RuntimeException( f+"° Fahrenheit is below absolute zero"); } return (f - 32.0) * (5.0 / 9.0); } public static void main(String[] args) { System.out.println(“212F is "+(toCelsius(212))+ " Celsius"); }}

Thursday, 17 March 2016

Page 11: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Java vs. Grace

10

method toCelsius(f:Number) -> Number { if (f < -459.4) then { Error.raise "{f}°F is below absolute zero" } (f - 32) * (5 / 9)}

print("212°F is {toCelsius(212)}°C")

Thursday, 17 March 2016

Page 12: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Java vs. Grace

11

public class Celsius {

public static double toCelsius(double f) { if (f < -459.4) { throw new RuntimeException( f+"° Fahrenheit is below absolute zero"); } return (f - 32.0) * (5.0 / 9.0); } public static void main(String[] args) { System.out.println(“212F is "+(toCelsius(212))+ " Celsius"); }}

Thursday, 17 March 2016

Page 13: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 14: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Types optional

Thursday, 17 March 2016

Page 15: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 16: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 17: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 18: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 19: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 20: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 21: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 22: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 23: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Grace Example// reads numbers from in stream returns the averagemethod average(in : InputStream) -> Number { var total := 0 var count := 0 while { ! in.atEnd } do { count := count + 1 total := total + in.readNumber } if (count == 0) then { 0 } else { total / count }}

12

Thursday, 17 March 2016

Page 24: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Simple “method request”

Like Smalltalk and Self: no type-dependent overloading

a “method request” names the target, the method, and provides the arguments

“dynamic dispatch” selects the correspondingly- named method in the receiver

“method execution” occurs in the receiver

13

(We’re trying to learn not to say "message-send" or "method call".)

Thursday, 17 March 2016

Page 25: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Uniform reference to attributes

14

theObject.x // could be method request or variable access

var x:Number := 3      // confidential variablevar x:Number is public := 3 // public variable

Thursday, 17 March 2016

Page 26: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Uniform reference to attributes

14

theObject.x // could be method request or variable access

var x:Number := 3      // confidential variablevar x:Number is public := 3 // public variable

Thursday, 17 March 2016

Page 27: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Uniform reference to attributes

14

theObject.x // could be method request or variable access

var x:Number := 3      // confidential variablevar x:Number is public := 3 // public variable

⎧⎨⎩

Thursday, 17 March 2016

Page 28: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Uniform reference to attributes

14

theObject.x // could be method request or variable access

var x:Number := 3      // confidential variablevar x:Number is public := 3 // public variable

⎧⎨⎩

var x’:Number := 3method x -> Number { x’ } // publicmethod x:= (newX:Number) { x’ := newX } // public

Thursday, 17 March 2016

Page 29: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

λ-expressions

“Lambdas are relegated to relative obscurity until Java makes them popular by not having them.” James Iry

Grace has λs. We call them “blocks”:

for (1..10) do { i : Number -> print(i) }

// multi-part method name

15

Thursday, 17 March 2016

Page 30: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Blocks

16

def welcomeAction = { print "Hello" }

Blocks are objects that represent functions

{ this is a block } — a λ-expressionblocks create objects that mimic functions

(like Smalltalk)

Thursday, 17 March 2016

Page 31: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Blocks

16

def welcomeAction = { print "Hello" }

object { method apply { print "Hello" } }

Blocks are objects that represent functions

{ this is a block } — a λ-expressionblocks create objects that mimic functions

(like Smalltalk)

Thursday, 17 March 2016

Page 32: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Blocks

16

def welcomeAction = { print "Hello" }

object { method apply { print "Hello" } }welcomeAction.apply

Blocks are objects that represent functions

{ this is a block } — a λ-expressionblocks create objects that mimic functions

(like Smalltalk)

Thursday, 17 March 2016

Page 33: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Constructing Objects

Thursday, 17 March 2016

Page 34: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

18

object { def x : Number = 2 def y : Number = 3 method distanceTo(other : Point) -> Number { ((x - other.x)^2 + (y - other.y)^2).sqrt }}

Object constructors

Thursday, 17 March 2016

Page 35: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

18

object { def x : Number = 2 def y : Number = 3 method distanceTo(other : Point) -> Number { ((x - other.x)^2 + (y - other.y)^2).sqrt }}

Object constructors

Thursday, 17 March 2016

Page 36: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

18

object { def x : Number = 2 def y : Number = 3 method distanceTo(other : Point) -> Number { ((x - other.x)^2 + (y - other.y)^2).sqrt }}

x 2

y 3

distanceTo(_) ...

Object constructors

Thursday, 17 March 2016

Page 37: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

19

class x (x’: Number) y (y’: Number) -> Point { def x : Number = x’ def y : Number = y’ method distanceTo (other : Point) -> Number { ((x - other.x)^2 + (y - other.y)^2).sqrt } }

Classes

Thursday, 17 March 2016

Page 38: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

19

x(_)y(_)

class x (x’: Number) y (y’: Number) -> Point { def x : Number = x’ def y : Number = y’ method distanceTo (other : Point) -> Number { ((x - other.x)^2 + (y - other.y)^2).sqrt } }

Classes

Thursday, 17 March 2016

Page 39: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

19

x(_)y(_)

class x (x’: Number) y (y’: Number) -> Point { def x : Number = x’ def y : Number = y’ method distanceTo (other : Point) -> Number { ((x - other.x)^2 + (y - other.y)^2).sqrt } }

x 2

y 3

distanceTo(_) ...

x 2

y 3

distanceTo(_) ...

x 2

y 3

distanceTo(_) ...

x 2

y 3

distanceTo(_) ...

Classes

Thursday, 17 March 2016

Page 40: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Classes are Factory Methods

20

method x (x’: Number) y (y’: Number) -> Point { object { def x : Number = x’ def y : Number = y’ method distanceTo(other:Point)->Number { ((x - other.x)^2 + (y - other.y)^2).sqrt } } }}

Thursday, 17 March 2016

Page 41: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheritance

class x (x’: Number) y (y’: Number) colour (c’ : Colour) {

inherits x (x’) y (y’)

def c : Colour is public = c’

}

21

More on inheritance later!

Thursday, 17 March 2016

Page 42: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Implicit initializationObject & class expressions can contain executable code

22

object { def x : Number = 2 def y : Number = 3 print “Just set x to {x}” method distanceTo(other : Point) -> Number { ((x - other.x)^2 + (y - other.y)^2).sqrt } print “I’m {self.distanceTo(origin)} from origin”}

Thursday, 17 March 2016

Page 43: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Classes

Classes are an implementation concept

Inheritance via object extension

Classes are not types

23

Thursday, 17 March 2016

Page 44: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

TypesTypes are for classification- Types logically come after objects, not before

- Structural, Gradual, Optionaltype Point = { x -> Number y -> Number distanceTo (other:Point) -> Number}

Types are sets of (public) method signaturesTypes can take types as parameters (a.k.a. Generics)

24

Thursday, 17 March 2016

Page 45: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Ask me about:(the missing) null pointer exceptions

Pattern matching

Blocks as partial functions

Exceptions

Modules as Objects

Unit tests

Dialects for:

resticting the language

extending the labguage

Teaching Experience

Graphics

How you can help

25

Thursday, 17 March 2016

Page 46: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

No null pointer exceptions!

26

Thursday, 17 March 2016

Page 47: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

No null pointer exceptions!

26

No null

Thursday, 17 March 2016

Page 48: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

No null pointer exceptions!

26

No null

Accessing uninitialized variable is an error

Thursday, 17 March 2016

Page 49: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

No null pointer exceptions!

26

No null

Accessing uninitialized variable is an error

Define objects for empty lists, empty trees, etc., and give them appropriate behavior

Thursday, 17 March 2016

Page 50: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

No null pointer exceptions!

26

No null

Accessing uninitialized variable is an error

Define objects for empty lists, empty trees, etc., and give them appropriate behavior

def emptyList = object { method length { 0 } method isEmpty { true } method head { noValue.raise "can't take the head of an empty list" } method tail { … }}

Thursday, 17 March 2016

Page 51: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Type Operations

Variants: Point | nil, Leaf<X> | Node<X>x : (A | B) ≡ x : A ∨ x : B

Algebraic constructors: T1 & T2: intersection, conforms to T1 and T2

Used to extend typesE.g., type ColorPoint = Point & {c -> Color}

union and subtraction available, but rarely used

Type parameters don't need variance annotations

27

Thursday, 17 March 2016

Page 52: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Match – Case

28

match ( x ) // x : 0 | String | Student

// match against a constant case { 0 -> print("Zero") } // typematch, binding a variable case { s : String -> print(s) }

// destructuring match, binding variables ... case { Student(name, id) -> print (name) }

Thursday, 17 March 2016

Page 53: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Blocks as partial functions

var blk := { n : Number −> n ∗ 2 }blk.apply 2 // -> 4blk.match 2 // -> SuccessfulMatch(4)blk.apply "text" // Runtime error: wanted Number, got Stringblk.match "text" // -> FailedMatch("text")

29

Thursday, 17 March 2016

Page 54: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

30

s:Scrutinee p:Pattern

match (s)case p1

case p2

Thursday, 17 March 2016

Page 55: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

30

s:Scrutinee p:Pattern

match(s)

match (s)case p1

case p2

Thursday, 17 March 2016

Page 56: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

30

s:Scrutinee p:Pattern

match(s)

MatchResult

match (s)case p1

case p2

Thursday, 17 March 2016

Page 57: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

30

s:Scrutinee p:Pattern

match(s)match does different things in different patterns:

Type patterns ask s for its type

Literal patterns check for =

etc

MatchResult

match (s)case p1

case p2

Thursday, 17 March 2016

Page 58: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

30

s:Scrutinee p:Pattern

match(s)

MatchResult

match (s)case p1

case p2

Thursday, 17 March 2016

Page 59: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

31

s:Scrutinee p:Pattern

match(s) match does different things in different patterns:

destructuring patterns can extract "fields" from scrutinee

MatchResult

Thursday, 17 March 2016

Page 60: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

31

s:Scrutinee p:Pattern

match(s)

MatchResult

Thursday, 17 March 2016

Page 61: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

31

s:Scrutinee p:Pattern

match(s)

extract

MatchResult

Thursday, 17 March 2016

Page 62: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

31

s:Scrutinee p:Pattern

match(s)

extract

extract returns a tuple containing the “internal state” of the scrutinee

MatchResult

Thursday, 17 March 2016

Page 63: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

31

s:Scrutinee p:Pattern

match(s)

extract

MatchResult

Thursday, 17 March 2016

Page 64: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Pattern-matching through method dispatch

31

s:Scrutinee p:Pattern

match(s)

extract

MatchResult

tuple

Thursday, 17 March 2016

Page 65: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Exceptions

Thursday, 17 March 2016

Page 66: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Exceptions as Patternsdef myError = Error.refine "MyError"

def negativeError = myError.refine "NegativeError"try { … negativeError.raise "{value} < 0" …

} catch {e: negativeError −> print "be more positive: {e}"} catch {e: Error −> print "Unexpected Error: {e}"

}

33

Thursday, 17 March 2016

Page 67: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

a whole Grace Program

def graceProgram = object { print "Hello World"}

34

Thursday, 17 March 2016

Page 68: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

a whole Grace Program

def graceProgram = object { print "Hello World"}

34

def graceModule = object {

print "Hello World"

}

Thursday, 17 March 2016

Page 69: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

a whole Grace Program

def graceProgram = object { print "Hello World"}

34

def graceModule = object {

print "Hello World"

}

every Grace file defines a module

Thursday, 17 March 2016

Page 70: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Modules are Objects

35

in a file called collections.grace :

def aList is public = object { … }

def anArray is public = object { … }

def aSet is public = object { … }

def aDictionary is public = object { … }

Thursday, 17 March 2016

Page 71: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Interpreting “Import”

36

import "collections" as coll

Thursday, 17 March 2016

Page 72: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Interpreting “Import”

36

import "collections" as coll

Thursday, 17 March 2016

Page 73: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Interpreting “Import”

36

import "collections" as coll

def temp917 = object {

}

def aList is public = object { … }

def anArray is public = object { … }

def aSet is public = object { … }

def aDictionary is public = object { … }

Thursday, 17 March 2016

Page 74: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Modules are Objects

37

in a file called bingoGame.grace :

import "collections" as coll

def aSet = coll.aSet

def bingoCard = aSet.with "Free Space"

Thursday, 17 March 2016

Page 75: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Modules are Objects

38

in a file called bingoGame.grace :

def coll = temp917

def aSet = coll.aSet

def bingoCard = aSet.with "Free Space"

Thursday, 17 March 2016

Page 76: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Dialects for Teaching

Thursday, 17 March 2016

Page 77: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Allows methods without explicit receivere.g., loops with invariants

Top-level code in dialect runs firstInitialize canvas, turtle initialization,...

Run an included checker over ASTCan exclude codee.g., require type annotations, invariantsPluggable static typing as part of dialect

40

Dialects

Thursday, 17 March 2016

Page 78: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Dialects Simple to Use

41

dialect "simpleControl"

// your program here;

// Uses constructs of dialect

// implicit receiver outer }

Thursday, 17 March 2016

Page 79: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

In Module "simpleControl":

method if (c) then (t : Block) else (f : Block) { c.ifTrue ( t ) else ( f ) } … method while (c : Block) do (a : Block) { if (c) then { a.apply while (c) do (a) } }

42

Dialects

Thursday, 17 March 2016

Page 80: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

object { // outermost enclosing object method if (c) then (t : Block) else (f : Block) { c.ifTrue ( t ) else ( f ) } … method while (c : Block) do (a : Block) { if (c) then { a.apply; while (c) do (a) } }

}43

Dialects provide outer scope

object { // your program here; sends messages to // implicit receiver outer }

Thursday, 17 March 2016

Page 81: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

What Was Tricky?

Thursday, 17 March 2016

Page 82: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheritance in Grace

45

Thursday, 17 March 2016

Page 83: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheritance in Grace

Key concept in OO languages

45

Thursday, 17 March 2016

Page 84: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheritance in Grace

Key concept in OO languages

Grace treats objects as primitive, Classes as syntactic sugar

45

Thursday, 17 March 2016

Page 85: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheritance in Grace

Key concept in OO languages

Grace treats objects as primitive, Classes as syntactic sugar

How to define inheritance from object?

45

Thursday, 17 March 2016

Page 86: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheritance in Grace

Key concept in OO languages

Grace treats objects as primitive, Classes as syntactic sugar

How to define inheritance from object?

Abadi-Cardelli puntedthough talked about delegationdefined inheritance for classes only

45

Thursday, 17 March 2016

Page 87: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

A Taste of TheorySemantics of OO languages

Classes are generators of fixed points (Cook, …)Contain “pre-methods” (parameterized on self)

Objects are the fixed points (give meaning to self!!)Methods have self baked in.

46

Thursday, 17 March 2016

Page 88: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

A Taste of TheorySemantics of OO languages

Classes are generators of fixed points (Cook, …)Contain “pre-methods” (parameterized on self)

Objects are the fixed points (give meaning to self!!)Methods have self baked in.

Inheritance on classesCopy (pre)methods from superclassAdd/replace (pre)methods from subclassSuper is collection of (pre)methods from superclass.

46

Thursday, 17 March 2016

Page 89: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Initialization of Fields for New Objects

Allocate space for all features

Run initializers for superclasses

Run initializers for subclass

47

Thursday, 17 March 2016

Page 90: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Tricky Bits

48

Thursday, 17 March 2016

Page 91: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Tricky BitsInitialization can request methods on self

48

Thursday, 17 March 2016

Page 92: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Tricky BitsInitialization can request methods on self

Object can be released into wild before initialization completed

Request method with self as parameterE.g., register graphics object on canvas

48

Thursday, 17 March 2016

Page 93: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Tricky BitsInitialization can request methods on self

Object can be released into wild before initialization completed

Request method with self as parameterE.g., register graphics object on canvas

Issues:What is meaning of self during initialization?Initialize with original method, or with override?

C++ vs Java semantics

48

Thursday, 17 March 2016

Page 94: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheriting from Objects

49

Thursday, 17 March 2016

Page 95: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheriting from ObjectsInheriting methods is same

Actually keep pre-methods, not methods

49

Thursday, 17 March 2016

Page 96: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheriting from ObjectsInheriting methods is same

Actually keep pre-methods, not methods

Allocate space for features

49

Thursday, 17 March 2016

Page 97: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheriting from ObjectsInheriting methods is same

Actually keep pre-methods, not methods

Allocate space for features

How to initialize inherited fields?Clone?Should everything support cloning?What kind of clone?

49

Thursday, 17 March 2016

Page 98: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Inheriting from ObjectsInheriting methods is same

Actually keep pre-methods, not methods

Allocate space for features

How to initialize inherited fields?Clone?Should everything support cloning?What kind of clone?

49

Rejected delegation as too complex for novices

Thursday, 17 March 2016

Page 99: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Our Solution

Allow inheritance from new objects only

To create object by inheritanceCreate method suite as beforeAllocate space for fieldsRun initialization code for creating super-object

but on new object

Run initialization code for sub-object

50

Thursday, 17 March 2016

Page 100: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

IssuesWorks fine when inheriting from classes

With objects, not so nice:Write clone-like methods if want to inheritWhat about immutable objects ?

Why write clone when no initialization??

Is there a better solution?

51

Thursday, 17 March 2016

Page 101: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

IssuesWorks fine when inheriting from classes

With objects, not so nice:Write clone-like methods if want to inheritWhat about immutable objects ?

Why write clone when no initialization??

Is there a better solution?

51

Simplest solution for immutable objects:

Change superobject to a class

Thursday, 17 March 2016

Page 102: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Modules and Typesimport "x" as x // keep typesimport "x" as x : Dynamic // throw types away

import "xSpec" as xSpec // separate spec and implimport "xImpl" as x : xSpec.T

import "xSpec" as spec // I conform to external specassertType<spec.T>(self)

type ExpectedType = { ... } // import confirms to local specimport "x" as x : ExpectedType

52

Thursday, 17 March 2016

Page 103: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & Parallelism

53

Thursday, 17 March 2016

Page 104: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & ParallelismHypothesis: we don’t know what to do about parallelism!

53

Thursday, 17 March 2016

Page 105: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & ParallelismHypothesis: we don’t know what to do about parallelism!

Conclusion: we must support different “models”

53

Thursday, 17 March 2016

Page 106: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & ParallelismHypothesis: we don’t know what to do about parallelism!

Conclusion: we must support different “models”

Software Transactional Memory (Clojure)

53

Thursday, 17 March 2016

Page 107: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & ParallelismHypothesis: we don’t know what to do about parallelism!

Conclusion: we must support different “models”

Software Transactional Memory (Clojure)Actors (Scala, Akka, Erlang)

53

Thursday, 17 March 2016

Page 108: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & ParallelismHypothesis: we don’t know what to do about parallelism!

Conclusion: we must support different “models”

Software Transactional Memory (Clojure)Actors (Scala, Akka, Erlang)Locks (Java)

53

Thursday, 17 March 2016

Page 109: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & ParallelismHypothesis: we don’t know what to do about parallelism!

Conclusion: we must support different “models”

Software Transactional Memory (Clojure)Actors (Scala, Akka, Erlang)Locks (Java) Atomic Sets

53

Thursday, 17 March 2016

Page 110: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Asynchrony & ParallelismHypothesis: we don’t know what to do about parallelism!

Conclusion: we must support different “models”

Software Transactional Memory (Clojure)Actors (Scala, Akka, Erlang)Locks (Java) Atomic Sets...

53

Thursday, 17 March 2016

Page 111: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Teaching with Grace

Thursday, 17 March 2016

Page 112: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Designed for Flexibility

We are not trying to prescribe how to teach programming

Grace tries to make it possible to teach in many styles, e.g.,

55

procedural first object-graphicsobjects first functional?turtle graphics test-driven

Thursday, 17 March 2016

Page 113: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Turtle graphicsdialect "logo"

def length = 150def diagonal = length * 2.sqrtlineWidth := 2square(length)turnRight 45penUpforward(diagonal)turnLeft 90penDownroof(diagonal/2)

method roof(slope) { lineColor := red forward(slope) turnLeft(90) forward(slope)}

method square(len) { repeat 4 times { forward(len) turnRight(90) }}

56sample programs/house.graceThursday, 17 March 2016

Page 114: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Turtle graphicsdialect "logo"

def length = 150def diagonal = length * 2.sqrtlineWidth := 2square(length)turnRight 45penUpforward(diagonal)turnLeft 90penDownroof(diagonal/2)

method roof(slope) { lineColor := red forward(slope) turnLeft(90) forward(slope)}

method square(len) { repeat 4 times { forward(len) turnRight(90) }}

56sample programs/house.graceThursday, 17 March 2016

Page 115: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

objectdraw Graphics

57

dialect objectdraw

object { inherits aGraphicApplication.size(400,400) var cloth // item to be moved method onMousePress(mousePoint) { cloth := aFilledRect.at(mousePoint)size(100,100)on(canvas) cloth.color := red }

method onMouseDrag(mousePoint)->Done { cloth.moveTo(mousePoint) } startGraphics // pop up window and start graphics}

Thursday, 17 March 2016

Page 116: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Unit testing dialectdialect "minitest"

method toCelsius(f:Number) { if (f < -459.4) then { Error.raise "{f}°F is below absolute zero" } (f - 32) * (5 / 9)}

testSuiteNamed "temperature conversion" with { test "zero" by { assert(toCelsius(32)) shouldBe (0) }

58

Thursday, 17 March 2016

Page 117: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

test "Boiling" by { assert(toCelsius(212)) shouldBe (100) } test "Alaska" by { assert(toCelsius(-40)) shouldBe (-40) } test "TooCold" by { assert{toCelsius(-500)} shouldRaise (Error) }}

59GUnit/GUnit project/f2c minitest.graceThursday, 17 March 2016

Page 118: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Exciting output:

60

Thursday, 17 March 2016

Page 119: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Schedule2011: 0.1, 0.2 and 0.5 language releases, hopefully prototype implementations

3 implementations in progress

2012 0.8 language spec, mostly complete implementations

2014 0.9 language spec, reference implementation, experimental classroom use

2014 1.0 language spec, robust implementations, textbooks, initial adopters for CS1/CS2

2015 ready for general adoption?61

Thursday, 17 March 2016

Page 120: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Schedule2011: 0.1, 0.2 and 0.5 language releases, hopefully prototype implementations

3 implementations in progress

2012 0.8 language spec, mostly complete implementations

2013 0.9 language spec, reference implementation, 2014: experimental classroom use

2015 1.0 language spec, robust implementations, textbooks, initial adopters for CS1/CS2

2016? ready for general adoption?62

Thursday, 17 March 2016

Page 121: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

Help!

Supporters

Programmers

Implementers

Library Writers

IDE Developers

Testers

Spec critics

Teachers

Students

Tech Writers

Textbook Authors

Blog editors

Community Builders

63

Thursday, 17 March 2016

Page 122: gracelang - homes.cs.washington.eduakcheung/pnw16/black.pdf · A!aining Grace in Teaching Programming James Noble Andrew Black Kim Bruce 1 gracelang.org Michael Homer Thursday, 17

No conclusions — we aren’t done yet

QuestionsCommentsSuggestionsBrickbats

64

Thursday, 17 March 2016