Typed Scheme From Scripts to Programs Sam Tobin-Hochstadt - - PowerPoint PPT Presentation

typed scheme
SMART_READER_LITE
LIVE PREVIEW

Typed Scheme From Scripts to Programs Sam Tobin-Hochstadt - - PowerPoint PPT Presentation

Typed Scheme From Scripts to Programs Sam Tobin-Hochstadt Northeastern University 1 The PL Renaissance 2 The PL Renaissance 3 The PL Renaissance 4 Whats good These languages are interactive designed for rapid development supported


slide-1
SLIDE 1

Typed Scheme

From Scripts to Programs

Sam Tobin-Hochstadt Northeastern University

1

slide-2
SLIDE 2

The PL Renaissance

2

slide-3
SLIDE 3

The PL Renaissance

3

slide-4
SLIDE 4

The PL Renaissance

4

slide-5
SLIDE 5

What’s good

These languages are interactive designed for rapid development supported by an active community modular higher-order And they’re exciting!

5

slide-6
SLIDE 6

What’s not so good

+ 900 lines

(define (main stx trace-flag super-expr deserialize-id-expr name-id interface-exprs defn-and-exprs)

(let-values ([(this-id) #'this-id] [(the-obj) (datum->syntax (quote-syntax here) (gensym 'self))] [(the-finder) (datum->syntax (quote-syntax here) (gensym 'find-self))]) (let* ([def-ctx (syntax-local-make-definition-context)] [localized-map (make-bound-identifier-mapping)] [any-localized? #f] [localize/set-flag (lambda (id) (let ([id2 (localize id)]) (unless (eq? id id2) (set! any-localized? #t)) id2))] [bind-local-id (lambda (id) (let ([l (localize/set-flag id)]) (syntax-local-bind-syntaxes (list id) #f def-ctx) (bound-identifier-mapping-put! localized-map id l)))] [lookup-localize (lambda (id) (bound-identifier-mapping-get localized-map id (lambda () ; If internal & external names are distinguished, ; we need to fall back to localize: (localize id))))]) ; ----- Expand definitions ----- (let ([defn-and-exprs (expand-all-forms stx defn-and-exprs def-ctx bind-local-id)] [bad (lambda (msg expr) (raise-syntax-error #f msg stx expr))] [class-name (if name-id (syntax-e name-id) (let ([s (syntax-local-infer-name stx)]) (if (syntax? s) (syntax-e s) s)))]) ; ------ Basic syntax checks ----- (for-each (lambda (stx) (syntax-case stx (-init init-rest -field -init-field inherit-field private public override augride public-final override-final augment-final pubment overment augment rename-super inherit inherit/super inherit/inner rename-inner inspect) [(form orig idp ...) (and (identifier? #'form) (or (free-identifier=? #'form (quote-syntax -init)) (free-identifier=? #'form (quote-syntax -init-field))))])))))))

6

slide-7
SLIDE 7

What’s not so good

+ 900 lines

; Start here: (define (main stx trace-flag super-expr deserialize-id-expr name-id interface-exprs defn-and-exprs)

(let-values ([(this-id) #'this-id] [(the-obj) (datum->syntax (quote-syntax here) (gensym 'self))] [(the-finder) (datum->syntax (quote-syntax here) (gensym 'find-self))]) (let* ([def-ctx (syntax-local-make-definition-context)] [localized-map (make-bound-identifier-mapping)] [any-localized? #f] [localize/set-flag (lambda (id) (let ([id2 (localize id)]) (unless (eq? id id2) (set! any-localized? #t)) id2))] [bind-local-id (lambda (id) (let ([l (localize/set-flag id)]) (syntax-local-bind-syntaxes (list id) #f def-ctx) (bound-identifier-mapping-put! localized-map id l)))] [lookup-localize (lambda (id) (bound-identifier-mapping-get localized-map id (lambda () ; If internal & external names are distinguished, ; we need to fall back to localize: (localize id))))]) ; ----- Expand definitions ----- (let ([defn-and-exprs (expand-all-forms stx defn-and-exprs def-ctx bind-local-id)] [bad (lambda (msg expr) (raise-syntax-error #f msg stx expr))] [class-name (if name-id (syntax-e name-id) (let ([s (syntax-local-infer-name stx)]) (if (syntax? s) (syntax-e s) s)))]) ; ------ Basic syntax checks ----- (for-each (lambda (stx) (syntax-case stx (-init init-rest -field -init-field inherit-field private public override augride public-final override-final augment-final pubment overment augment rename-super inherit inherit/super inherit/inner rename-inner inspect) [(form orig idp ...) (and (identifier? #'form) (or (free-identifier=? #'form (quote-syntax -init)) (free-identifier=? #'form (quote-syntax -init-field))))])))))))

7

slide-8
SLIDE 8

What’s not so good

+ 900 lines

; main : stx bool stx id id stxs stxs -> stx (define (main stx trace-flag super-expr deserialize-id-expr name-id interface-exprs defn-and-exprs)

(let-values ([(this-id) #'this-id] [(the-obj) (datum->syntax (quote-syntax here) (gensym 'self))] [(the-finder) (datum->syntax (quote-syntax here) (gensym 'find-self))]) (let* ([def-ctx (syntax-local-make-definition-context)] [localized-map (make-bound-identifier-mapping)] [any-localized? #f] [localize/set-flag (lambda (id) (let ([id2 (localize id)]) (unless (eq? id id2) (set! any-localized? #t)) id2))] [bind-local-id (lambda (id) (let ([l (localize/set-flag id)]) (syntax-local-bind-syntaxes (list id) #f def-ctx) (bound-identifier-mapping-put! localized-map id l)))] [lookup-localize (lambda (id) (bound-identifier-mapping-get localized-map id (lambda () ; If internal & external names are distinguished, ; we need to fall back to localize: (localize id))))]) ; ----- Expand definitions ----- (let ([defn-and-exprs (expand-all-forms stx defn-and-exprs def-ctx bind-local-id)] [bad (lambda (msg expr) (raise-syntax-error #f msg stx expr))] [class-name (if name-id (syntax-e name-id) (let ([s (syntax-local-infer-name stx)]) (if (syntax? s) (syntax-e s) s)))]) ; ------ Basic syntax checks ----- (for-each (lambda (stx) (syntax-case stx (-init init-rest -field -init-field inherit-field private public override augride public-final override-final augment-final pubment overment augment rename-super inherit inherit/super inherit/inner rename-inner inspect) [(form orig idp ...) (and (identifier? #'form) (or (free-identifier=? #'form (quote-syntax -init)) (free-identifier=? #'form (quote-syntax -init-field))))])))))))

8

slide-9
SLIDE 9

What’s not so good

+ 900 lines

; main : stx bool stx (or #f id) id stxs stxs -> stx (define (main stx trace-flag super-expr deserialize-id-expr name-id interface-exprs defn-and-exprs)

(let-values ([(this-id) #'this-id] [(the-obj) (datum->syntax (quote-syntax here) (gensym 'self))] [(the-finder) (datum->syntax (quote-syntax here) (gensym 'find-self))]) (let* ([def-ctx (syntax-local-make-definition-context)] [localized-map (make-bound-identifier-mapping)] [any-localized? #f] [localize/set-flag (lambda (id) (let ([id2 (localize id)]) (unless (eq? id id2) (set! any-localized? #t)) id2))] [bind-local-id (lambda (id) (let ([l (localize/set-flag id)]) (syntax-local-bind-syntaxes (list id) #f def-ctx) (bound-identifier-mapping-put! localized-map id l)))] [lookup-localize (lambda (id) (bound-identifier-mapping-get localized-map id (lambda () ; If internal & external names are distinguished, ; we need to fall back to localize: (localize id))))]) ; ----- Expand definitions ----- (let ([defn-and-exprs (expand-all-forms stx defn-and-exprs def-ctx bind-local-id)] [bad (lambda (msg expr) (raise-syntax-error #f msg stx expr))] [class-name (if name-id (syntax-e name-id) (let ([s (syntax-local-infer-name stx)]) (if (syntax? s) (syntax-e s) s)))]) ; ------ Basic syntax checks ----- (for-each (lambda (stx) (syntax-case stx (-init init-rest -field -init-field inherit-field private public override augride public-final override-final augment-final pubment overment augment rename-super inherit inherit/super inherit/inner rename-inner inspect) [(form orig idp ...) (and (identifier? #'form) (or (free-identifier=? #'form (quote-syntax -init)) (free-identifier=? #'form (quote-syntax -init-field))))])))))))

9

slide-10
SLIDE 10

What’s not so good

+ 900 lines

(: main (Stx Bool Stx (U #f Id) Id Stxs Stxs -> Stx)) (define (main stx trace-flag super-expr deserialize-id-expr name-id interface-exprs defn-and-exprs)

(let-values ([(this-id) #'this-id] [(the-obj) (datum->syntax (quote-syntax here) (gensym 'self))] [(the-finder) (datum->syntax (quote-syntax here) (gensym 'find-self))]) (let* ([def-ctx (syntax-local-make-definition-context)] [localized-map (make-bound-identifier-mapping)] [any-localized? #f] [localize/set-flag (lambda (id) (let ([id2 (localize id)]) (unless (eq? id id2) (set! any-localized? #t)) id2))] [bind-local-id (lambda (id) (let ([l (localize/set-flag id)]) (syntax-local-bind-syntaxes (list id) #f def-ctx) (bound-identifier-mapping-put! localized-map id l)))] [lookup-localize (lambda (id) (bound-identifier-mapping-get localized-map id (lambda () ; If internal & external names are distinguished, ; we need to fall back to localize: (localize id))))]) ; ----- Expand definitions ----- (let ([defn-and-exprs (expand-all-forms stx defn-and-exprs def-ctx bind-local-id)] [bad (lambda (msg expr) (raise-syntax-error #f msg stx expr))] [class-name (if name-id (syntax-e name-id) (let ([s (syntax-local-infer-name stx)]) (if (syntax? s) (syntax-e s) s)))]) ; ------ Basic syntax checks ----- (for-each (lambda (stx) (syntax-case stx (-init init-rest -field -init-field inherit-field private public override augride public-final override-final augment-final pubment overment augment rename-super inherit inherit/super inherit/inner rename-inner inspect) [(form orig idp ...) (and (identifier? #'form) (or (free-identifier=? #'form (quote-syntax -init)) (free-identifier=? #'form (quote-syntax -init-field))))])))))))

10

slide-11
SLIDE 11

Thesis

Module-by-module porting of code from an untyped language to a typed sister language allows for an easy transition from untyped scripts to typed programs.

11

slide-12
SLIDE 12

Thesis

Module-by-module porting of code from an untyped language to a typed sister language allows for an easy transition from untyped scripts to typed programs.

12

slide-13
SLIDE 13

Thesis

Module-by-module porting of code from an untyped language to a typed sister language allows for an easy transition from untyped scripts to typed programs.

13

slide-14
SLIDE 14

Thesis

Module-by-module porting of code from an untyped language to a typed sister language allows for an easy transition from untyped scripts to typed programs.

14

slide-15
SLIDE 15

Why PLT Scheme?

Modules Contracts Abstractions

15

slide-16
SLIDE 16

Typed Scheme in 3 Slides

16

slide-17
SLIDE 17

Hello World

hello #lang scheme (printf "Hello World\n")

17

slide-18
SLIDE 18

Hello World

hello #lang typed-scheme (printf "Hello World\n")

18

slide-19
SLIDE 19

Functions

ack #lang scheme ; ack : Integer Integer -> Integer (define (ack m n) (cond [(<= m 0) (+ n 1)] [(<= n 0) (ack (- m 1) 1)] [else (ack (- m 1) (ack m (- n 1)))])) (ack 2 3)

19

slide-20
SLIDE 20

Functions

ack #lang typed-scheme (: ack (Integer Integer -> Integer)) (define (ack m n) (cond [(<= m 0) (+ n 1)] [(<= n 0) (ack (- m 1) 1)] [else (ack (- m 1) (ack m (- n 1)))])) (ack 2 3)

20

slide-21
SLIDE 21

Modules

ack #lang scheme ; ack : Integer Integer -> Integer (define (ack m n) (cond [(<= m 0) (+ n 1)] [(<= n 0) (ack (- m 1) 1)] [else (ack (- m 1) (ack m (- n 1)))])) compute #lang scheme (require ack) (ack 2 3)

21

slide-22
SLIDE 22

Modules

ack #lang typed-scheme (: ack (Integer Integer -> Integer)) (define (ack m n) (cond [(<= m 0) (+ n 1)] [(<= n 0) (ack (- m 1) 1)] [else (ack (- m 1) (ack m (- n 1)))])) compute #lang scheme (require ack) (ack 2 3)

22

slide-23
SLIDE 23

Modules

ack #lang scheme ; ack : Integer Integer -> Integer (define (ack m n) (cond [(<= m 0) (+ n 1)] [(<= n 0) (ack (- m 1) 1)] [else (ack (- m 1) (ack m (- n 1)))])) compute #lang typed-scheme (require [ack (Integer Integer -> Integer)]) (ack 2 3)

23

slide-24
SLIDE 24

Modules

ack #lang typed-scheme (: ack (Integer Integer -> Integer)) (define (ack m n) (cond [(<= m 0) (+ n 1)] [(<= n 0) (ack (- m 1) 1)] [else (ack (- m 1) (ack m (- n 1)))])) compute #lang typed-scheme (require ack) (ack 2 3)

24

slide-25
SLIDE 25

Sound Interoperation

25

slide-26
SLIDE 26

Typed & Untyped

server #lang typed-scheme (: add5 (Number -> Number)) (define (add5 x) (+ x 5)) client #lang scheme (require server) (add5 7)

26

slide-27
SLIDE 27

Typed & Untyped

Untyped code can make mistakes

server #lang typed-scheme (: add5 (Number -> Number)) (define (add5 x) (+ x 5)) client #lang scheme (require server) (add5 "seven")

27

slide-28
SLIDE 28

Typed & Untyped

Untyped code can make mistakes

server #lang typed-scheme (: add5 (Number -> Number)) (define (add5 x) (+ x 5)) client #lang scheme (require server) (add5 "seven")

+: expects type <number> as 1st argument

28

slide-29
SLIDE 29

Typed & Untyped

Catch errors dynamically at the boundary

server #lang typed-scheme (: add5 (Number -> Number)) (define (add5 x) (+ x 5)) client #lang scheme (require server) (add5 "seven")

client broke the contract on add5

29

slide-30
SLIDE 30

Typed & Untyped

Catch errors dynamically at the boundary

server #lang scheme (define (add5 x) "x plus 5") client #lang typed-scheme (require server [add5 (Number -> Number)]) (add5 7)

server interface broke the contract on add5

30

slide-31
SLIDE 31

Typed & Untyped

Catch errors dynamically at the boundary

server #lang typed-scheme (: addx (Number -> (Number -> Number))) (define (addx x) (lambda (y) (+ x y))) client #lang scheme (require server) ((addx 7) 'bad)

client broke the contract on add5

31

slide-32
SLIDE 32

The Blame Theorem

If the program raises a contract error, the blame is not assigned to a typed module.

32

slide-33
SLIDE 33

The Blame Theorem

Well-typed modules can’t get blamed.

33

slide-34
SLIDE 34

The Blame Theorem

Allows local reasoning about typed modules, without changing untyped modules. Choose how much static checking you want.

34

slide-35
SLIDE 35

Types for Scheme

Occurrence Typing Variable-Arity Refinement Types Ad-Hoc Data

35

slide-36
SLIDE 36

Types for Scheme

  • ccur

#lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) (add1 x) 0))

36

slide-37
SLIDE 37

Types for Scheme

refine #lang typed-scheme (: check (String -> (Refinement sql-safe?))) (define (check s) (if (sql-safe? s) s (error "unsafe string!")))

37

slide-38
SLIDE 38

Types for Scheme

union #lang typed-scheme (define-type-alias BT (U Number (Pair BT BT))) (: sizeof (BT -> Number)) (define (sizeof b) (if (number? b) 1 (+ 1 (sizeof (car b)) (sizeof (cdr b)))))

38

slide-39
SLIDE 39

Types for Scheme

varar #lang typed-scheme (: wrap (∀ (B A ...) ((A ... -> B) -> (A ... -> B)))) (define (wrap f) (lambda args (printf "args are: ~a\n" args) (apply f args)))

39

slide-40
SLIDE 40

Scheme Idioms

number? #lang scheme (define (f x) (if (number? x) (add1 x) 0))

40

slide-41
SLIDE 41

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) (add1 x) 0))

41

slide-42
SLIDE 42

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) (add1 x) 0)) type: Any

42

slide-43
SLIDE 43

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x type: Any ) (add1 x) 0))

43

slide-44
SLIDE 44

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) (add1 x) 0)) type: Number

44

slide-45
SLIDE 45

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? type: (Any -> Boolean : Number) x) (add1 x) 0))

45

slide-46
SLIDE 46

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x type: Any

  • bject: x

) (add1 x) 0))

46

slide-47
SLIDE 47

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) type: Boolean filter: (apply-filter Number x) (add1 x) 0))

47

slide-48
SLIDE 48

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) type: Boolean filter: Numberx (add1 x) 0))

48

slide-49
SLIDE 49

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) (add1 x) 0)) env: x:Any + Numberx

49

slide-50
SLIDE 50

Filters & Objects

number? #lang typed-scheme (: f (Any -> Number)) (define (f x) (if (number? x) (add1 x) 0)) env: x:Number type: Number

50

slide-51
SLIDE 51

Scheme Idioms

else #lang scheme ; s is a symbol, number or string (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s]))

51

slide-52
SLIDE 52

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s]))

52

slide-53
SLIDE 53

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s type: (U Symbol Number String) ) (symbol->string s)] [(number? s) (number->string s)] [else s]))

53

slide-54
SLIDE 54

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s type: Symbol )] [(number? s) (number->string s)] [else s]))

54

slide-55
SLIDE 55

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s type: (U Number String) ) (number->string s)] [else s]))

55

slide-56
SLIDE 56

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s type: Number )] [else s]))

56

slide-57
SLIDE 57

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s type: String ]))

57

slide-58
SLIDE 58

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) type: (Any -> Boolean : Symbol | Symbol

58

slide-59
SLIDE 59

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) type: Boolean filter: Symbols | Symbols (symbol->string s)] [(number? s) (number->string s)] [else s]))

59

slide-60
SLIDE 60

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:(U Symbol Number String) + Symbols

60

slide-61
SLIDE 61

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:Symbol

61

slide-62
SLIDE 62

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:(U Symbol Number String) + Symbols

62

slide-63
SLIDE 63

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:(U Number String)

63

slide-64
SLIDE 64

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) type: (Any -> Boolean : Number | Number

64

slide-65
SLIDE 65

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) type: Boolean filter: Numbers | Numbers (number->string s)] [else s]))

65

slide-66
SLIDE 66

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:(U Number String) + Numbers

66

slide-67
SLIDE 67

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:Number

67

slide-68
SLIDE 68

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:(U Number String) + Numbers

68

slide-69
SLIDE 69

Then & Else

else #lang typed-scheme (: ->string ((U Symbol Number String) -> String)) (define (->string s) (cond [(symbol? s) (symbol->string s)] [(number? s) (number->string s)] [else s])) env: s:String

69

slide-70
SLIDE 70

Scheme Idioms

and #lang scheme ; g : Any (U String Number) -> Number (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y]))

70

slide-71
SLIDE 71

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y]))

71

slide-72
SLIDE 72

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) filter: Numberx | Numberx (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y]))

72

slide-73
SLIDE 73

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y) filter: Stringy | Stringy ) (+ x (string-length y))] [(number? x) (+ x y)] [else y]))

73

slide-74
SLIDE 74

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y])) filter: Numberx Stringy |

74

slide-75
SLIDE 75

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y])) filter: Numberx Stringy | Numberx ⊃ Stringy

75

slide-76
SLIDE 76

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y])) env: Numberx ⊃ Stringy filter: Numberx

76

slide-77
SLIDE 77

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y])) env: Numberx ⊃ Stringy filter: Numberx Stringy

77

slide-78
SLIDE 78

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y])) env: x:Any y:(U Number String) + Numberx Stringy

78

slide-79
SLIDE 79

Logical Reasoning

and #lang typed-scheme (: g (Any (U Number String) -> Number)) (define (g x y) (cond [(and (number? x) (string? y)) (+ x (string-length y))] [(number? x) (+ x y)] [else y])) env: x:Number y:Number

79

slide-80
SLIDE 80

All Together Now

#lang typed-scheme (: f ((U Number String) (Pair Any Any) -> Number)) (define (f input extra) (cond [(and (number? input) (number? (car extra))) (+ input (car extra))] [(number? (car extra)) (+ (string-length input) (car extra))] [else 0]))

80

slide-81
SLIDE 81

Easy Integration

Implementation Validation

81

slide-82
SLIDE 82

Implementation

82

slide-83
SLIDE 83

Implementation

tslide #lang typed-scheme (: subtitle-pict : (String -> Pict)) (define (subtitle-pict s) (text s (current-title-font) large-text-size))

83

slide-84
SLIDE 84

Validation

Lines Increase Fixes (Good) Problems (Bad) Squad Metrics Acct Spam System Rand Total

2369 511 407 315 1290 618 5510 7% 25% 7% 6% 1% 3% 7% 5 3 4 5 8 25 7 4 3 1 1 16

84

slide-85
SLIDE 85

Sample Fixes

assert #lang scheme (+ 10 (string->number str))

85

slide-86
SLIDE 86

Sample Fixes

assert #lang typed-scheme (+ 10 (assert (string->number str)))

86

slide-87
SLIDE 87

Sample Fixes

div #lang scheme (define (divs . args) (* -1 (apply / args)))

87

slide-88
SLIDE 88

Sample Fixes

div #lang typed-scheme (define (divs arg . args) (* -1 (apply / arg args)))

88

slide-89
SLIDE 89

Sample Problems

cond #lang scheme (cond [(< x 0) 'negative] [(= x 0) 'zero] [(> x 0) 'positive])

89

slide-90
SLIDE 90

Sample Problems

cond #lang typed-scheme (cond [(< x 0) 'negative] [(= x 0) 'zero] [else 'positive])

90

slide-91
SLIDE 91

Sample Problems

mutate #lang scheme (define pr (make-pair x y)) (when (string? (pair-left pr)) (set-pair-left! pr (string->symbol (pair-left pr))))

91

slide-92
SLIDE 92

Sample Problems

mutate #lang typed-scheme (define pr (make-pair (if (string? x) (string->number x) x) y))

92

slide-93
SLIDE 93

Related Work

93

slide-94
SLIDE 94

Interlanguage Integration

ProfessorJ Gray et al. (2005) Multilanguage Systems Matthews and Findler (2007)

94

slide-95
SLIDE 95

Types for Untyped Languages

John Reynolds (1968) "Some account should be taken of the premises in conditional expressions." Soft Typing Types for Scheme Strongtalk

95

slide-96
SLIDE 96

Types for Untyped Languages

John Reynolds (1968) Soft Typing Fagan (1991), Aiken (1994) Wright (1997), Flanagan (1999) Types for Scheme Strongtalk

96

slide-97
SLIDE 97

Types for Untyped Languages

John Reynolds (1968) Soft Typing Types for Scheme SPS (Wand 1984), Leavens (2005) Infer (Haynes 1995) Strongtalk

97

slide-98
SLIDE 98

Types for Untyped Languages

John Reynolds (1968) Soft Typing Types for Scheme Strongtalk Bracha and Griswold (1993)

98

slide-99
SLIDE 99

Contracts & Modules

Contracts Findler & Fellesien (2002) Modules with Macros Flatt (2002)

99

slide-100
SLIDE 100

Recent Work

Gradual Typing Siek et al (2006-2009), Wadler & Findler (2007), Herman et al (2007) DRuby Furr et al (2009)

100

slide-101
SLIDE 101

Conclusion

101

slide-102
SLIDE 102

Thesis

Module-by-module porting of code from an untyped language to a typed sister language allows for an easy transition from untyped scripts to typed programs.

102

slide-103
SLIDE 103

Support

Sound Typed-Untyped Interoperation Type System for Scheme Full-scale Implementation Empirical Validation

103

slide-104
SLIDE 104

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Olin Shivers

104

slide-105
SLIDE 105

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Aaron Turon

105

slide-106
SLIDE 106

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Felix Klock

106

slide-107
SLIDE 107

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to James Hamblin

107

slide-108
SLIDE 108

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to James Jungbauer

108

slide-109
SLIDE 109

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Dan Brown

109

slide-110
SLIDE 110

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Lazlo Babai

110

slide-111
SLIDE 111

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Matthew Flatt

111

slide-112
SLIDE 112

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Stevie Strickland

112

slide-113
SLIDE 113

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Guy Steele

113

slide-114
SLIDE 114

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Robby Findler

114

slide-115
SLIDE 115

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Sukyoung Ryu

115

slide-116
SLIDE 116

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Carl Eastlund

116

slide-117
SLIDE 117

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Eric Allen

117

slide-118
SLIDE 118

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Ivan Gazeau

118

slide-119
SLIDE 119

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Katie Edmonds

119

slide-120
SLIDE 120

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Mitch Wand

120

slide-121
SLIDE 121

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Dave Herman

121

slide-122
SLIDE 122

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Jan-Willem Maessen

122

slide-123
SLIDE 123

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Matthias Felleisen

123

slide-124
SLIDE 124

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Ryan Culpepper

124

slide-125
SLIDE 125

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Vincent St-Amour

125

slide-126
SLIDE 126

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Jesse Tov

126

slide-127
SLIDE 127

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Christine Flood

127

slide-128
SLIDE 128

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Steve Hochstadt

128

slide-129
SLIDE 129

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to David Chase

129

slide-130
SLIDE 130

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Elizabeth Tobin

130

slide-131
SLIDE 131

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Victor Luchangco

131

slide-132
SLIDE 132

Try Typed Scheme

Installer and Documentation http://www.plt-scheme.org

Thanks to Ryan Culpepper

132

slide-133
SLIDE 133

Proposal

Occurence Typing Done, and more Variable-arity Polymorphism Done Keyword and Optional Arguments Done: Use & Import/Export Not Done: Definition Validation Some Done

133