Typed & Untyped
Untyped code can make mistakes
server
#lang typed/racket
(: add5 (Number -> Number))
(define (add5 x) (+ x 5))
client
#lang racket
(require server)
(add5 "seven")
Slide 21
Slide 21 text
Typed & Untyped
Untyped code can make mistakes
server
#lang typed/racket
(: add5 (Number -> Number))
(define (add5 x) )
client
#lang racket
(require server)
(add5 "seven")
+: expects type as 1st argument
Slide 22
Slide 22 text
Typed & Untyped
Catch errors dynamically at the boundary
server
#lang typed/racket
(: add5 (Number -> Number))
(define (add5 x) (+ x 5))
client
#lang racket
(require server)
(add5 "seven")
client broke the contract on add5
Slide 23
Slide 23 text
Typed & Untyped
Catch errors dynamically at the boundary
server
#lang racket
(define (add5 x) "x plus 5")
client
#lang typed/racket
(require server
[add5 (Number -> Number)])
(add5 7)
server interface broke the contract on add5
Slide 24
Slide 24 text
Typed & Untyped
Catch errors dynamically at the boundary
server
#lang typed/racket
(: addx (Number -> (Number -> Number)))
(define (addx x) (lambda (y) (+ x y)))
client
#lang racket
(require server)
((addx 7) 'bad)
client broke the contract on add5
Slide 25
Slide 25 text
The Blame Theorem
If the program raises a contract error, the blame is not
assigned to a typed module.
Slide 26
Slide 26 text
The Blame Theorem
Well-typed modules can’t get blamed. [Wadler & Findler]
Slide 27
Slide 27 text
The Blame Theorem
Allows local reasoning about typed modules, without
changing untyped modules.
Choose how much static checking you want.
Slide 28
Slide 28 text
Checking Existing Languages
Occurrence Typing Variable-Arity
Refinement Types
Ad-Hoc Data
Occurrence Typing
(define-type Peano (U 'Z (List 'S Peano)))
(: convert : Peano -> Number)
(define (convert n)
(cond [(symbol? n) 0]
[else (add1 (convert (rest n)))]))
n : (List 'S Peano)
n
n : (List 'S Peano)
Slide 38
Slide 38 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
Slide 39
Slide 39 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
s : (U String Symbol) s* : (U String Symbol)
s
s : (U String Symbol)
s*
s* : (U String Symbol)
Slide 40
Slide 40 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
s : String s* : String
s
s : String
s*
s* : String
Slide 41
Slide 41 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
s : String s* : Symbol
s
s : String
s*
s* : Symbol
Slide 42
Slide 42 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
s : Symbol s* : String
s
s : Symbol
s*
s* : String
Slide 43
Slide 43 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
s : Symbol s* : Symbol
s
s : Symbol
s*
s* : Symbol
Occurrence Typing
(define-type Peano (U 'Z (List 'S Peano)))
(: convert : Peano -> Number)
(define (convert n)
(cond [(symbol? n) 0]
[else (add1 (convert (rest n)))]))
⊢ (List 'S Peano) @ n
(symbol? n)
⊢ Symbol @ n
Slide 48
Slide 48 text
Occurrence Typing
(define-type Peano (U 'Z (List 'S Peano)))
(: convert : Peano -> Number)
(define (convert n)
(cond [(symbol? n) 0]
[else (add1 (convert (rest n)))]))
⊢ Peano @ n ⊢ Symbol @ n
⊢ (List 'S Peano) @ n
(symbol? n)
⊢ Symbol @ n
Slide 49
Slide 49 text
Occurrence Typing
(define-type Peano (U 'Z (List 'S Peano)))
(: convert : Peano -> Number)
(define (convert n)
(cond [(symbol? n) 0]
[else (add1 (convert (rest n)))]))
⊢ (U 'Z (List 'S Peano)) @ n ⊢ Symbol @ n
⊢ (List 'S Peano) @ n
(symbol? n)
⊢ Symbol @ n
Slide 50
Slide 50 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
Slide 51
Slide 51 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
⊢ String @ s ⊢ String @ s*
(string-append s s*)
⊢ String @ s ⊢ String @ s*
Slide 52
Slide 52 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
⊢ String @ s ∧ String @ s*
⊢ String @ s ⊢ String @ s*
(string? s)
String @ s
(string? s*)
String @ s*
Slide 53
Slide 53 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
⊢ Symbol @ s*
(string-append s (symbol->string s*))
Symbol @ s*
Slide 54
Slide 54 text
Occurrence Typing
(: combine :
(U String Symbol) (U String Symbol) -> String)
(define (combine s s*)
(cond [(and (string? s) (string? s*))
(string-append s s*)]
[(string? s)
(string-append s (symbol->string s*))]
[(string? s*)
(string-append (symbol->string s) s*)]
[else
(string-append (symbol->string s)
(symbol->string s*))]))
⊢ String @ s ⊢ String @ s ⊃ String @ s*
⊢ Symbol @ s*
(and (string? s) (string? s*))
String @ s ⊃ String @ s*
(string? s)
String @ s
Slide 55
Slide 55 text
Building on Existing Languages
Slide 56
Slide 56 text
Languages as Libraries
name
#lang typed/racket
....
Slide 57
Slide 57 text
Languages as Libraries
(module name typed/racket
(#%module-begin
....) )
Slide 58
Slide 58 text
Languages as Libraries
typed/racket
#lang racket
(define-syntax (#%module-begin stx)
....)
(module name typed/racket
(#%module-begin
....) )
#%module-begin
#%module-begin
Slide 59
Slide 59 text
Defining A Language
(define-syntax (#%module-begin stx)
(syntax-parse stx
[(_ forms ...)
(let ()
(for ([f (syntax->list #'(forms ...))])
(typecheck f))
#'(#%plain-module-begin forms ...))]))
Slide 60
Slide 60 text
Defining A Language
(define-syntax (#%module-begin stx)
(syntax-parse stx
[(_ forms ...)
(let ()
(for ([f (syntax->list #'(forms ...))])
(typecheck f))
#'(#%plain-module-begin forms ...))]))
f
Slide 61
Slide 61 text
Defining A Language
(define-syntax (#%module-begin stx)
(syntax-parse stx
[(_ forms ...)
(let ([forms* (local-expand #'(forms ...))])
(for ([f (rest (syntax->list forms*))])
(typecheck f))
#'(#%plain-module-begin #,forms*))]))
Slide 62
Slide 62 text
Defining A Language
(define-syntax (#%module-begin stx)
(syntax-parse stx
[(_ forms ...)
(let ([forms* (local-expand #'(forms ...))])
(for ([f (rest (syntax->list forms*))])
(typecheck f))
(let ([forms** (optimize forms*)])
#'(#%plain-module-begin #,forms**)))]))
Slide 63
Slide 63 text
Typechecking
(define (typecheck f)
(syntax-parse f
; variables
[v:identifier
(lookup-type #'v)]
; abstractions
[(lambda (x) e)
(define t (syntax-property #'x 'type-label))
(set-type! #'x t)
(typecheck #'e)]
; about 10 more cases
....))
Slide 64
Slide 64 text
Typechecking
(define (typecheck f)
(syntax-parse f
; variables
[v:identifier
(lookup-type #'v)]
; abstractions
[(lambda (x) e)
(define t (syntax-property #'x 'type-label))
(set-type! #'x t)
(typecheck #'e)]
; about 10 more cases
....))
Slide 65
Slide 65 text
Typechecking
(define (typecheck f)
(syntax-parse f
; variables
[v:identifier
(lookup-type #'v)]
; abstractions
[(lambda (x) e)
(define t (syntax-property #'x 'type-label))
(set-type! #'x t)
(typecheck #'e)]
; about 10 more cases
....))
Slide 66
Slide 66 text
Optimization
#lang typed/racket
(: norm : Float Float -> Float)
(define (norm x y)
(flsqrt (+ (* x x) (* y y))))
Slide 67
Slide 67 text
Optimization
#lang typed/racket
(: norm : Float Float -> Float)
(define (norm x y)
(unsafe-flsqrt
(unsafe-fl+ (unsafe-fl* x x) (unsafe-fl* y y))))
Slide 68
Slide 68 text
Typed Racket as Research Agenda
Slide 69
Slide 69 text
Contracts
(Vectorof (Integer -> Integer))
(class/c ....)
(unit/c ....)
Analysis using contracts
With Stevie Strickland, Robby Findler, Matthew Flatt, David Van Horn
Slide 70
Slide 70 text
Types
First-class Classes
Generic Operations
Variable-Arity Functions
.... and Inference
With Stevie Strickland, Asumu Takikawa, Matthias Felleisen
Slide 71
Slide 71 text
Macros
syntax-parse
Macro Debugging
Defensible Abstractions
With Ryan Culpepper
Slide 72
Slide 72 text
Education
Beginner-Level Error Messages
#lang typed/racket
(first 3)
Type Checker: Polymorphic function first
could not be applied to arguments:
Domains: (Pairof a (Listof b))
(Listof a)
Arguments: Positive-Fixnum
With Eli Barzilay, Matthias Felleisen
Slide 73
Slide 73 text
Optimization
Low-Level Operations for
• Structure Representation
• Memory Allocation
• ...
With Vincent St-Amour, Matthew Flatt
Slide 74
Slide 74 text
Jesse Tov
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 75
Slide 75 text
Jesse Tov
Felix Klock
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 76
Slide 76 text
Jesse Tov
Felix Klock
Eli Barzilay
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 77
Slide 77 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 78
Slide 78 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 79
Slide 79 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 80
Slide 80 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 81
Slide 81 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 82
Slide 82 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 83
Slide 83 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 84
Slide 84 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 85
Slide 85 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 86
Slide 86 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 87
Slide 87 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Stevie Strickland
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 88
Slide 88 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Stevie Strickland
Matthias Felleisen
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 89
Slide 89 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Stevie Strickland
Matthias Felleisen
Vincent St-Amour
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 90
Slide 90 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Stevie Strickland
Matthias Felleisen
Vincent St-Amour
Shriram Krishnamurthi
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 91
Slide 91 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Stevie Strickland
Matthias Felleisen
Vincent St-Amour
Shriram Krishnamurthi
Students at Northeastern and Brown
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 92
Slide 92 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Stevie Strickland
Matthias Felleisen
Vincent St-Amour
Shriram Krishnamurthi
Students at Northeastern and Brown
And everyone who has tried Typed Racket!
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation
Slide 93
Slide 93 text
Jesse Tov
Felix Klock
Eli Barzilay
Ivan Gazeau
Neil Toronto
Aaron Turon
Carl Eastlund
Robby Findler
Jay McCarthy
Matthew Flatt
Hari Prashanth
Ryan Culpepper
David Van Horn
Stevie Strickland
Matthias Felleisen
Vincent St-Amour
Shriram Krishnamurthi
Students at Northeastern and Brown
And everyone who has tried Typed Racket!
Thanks!
Available from
racket-lang.org
Supported by the Mozilla Foundation