A Survey Language form Box1HouseOwning { hasSoldHouse: "Sold a - - PowerPoint PPT Presentation

a survey language
SMART_READER_LITE
LIVE PREVIEW

A Survey Language form Box1HouseOwning { hasSoldHouse: "Sold a - - PowerPoint PPT Presentation

A Survey Language form Box1HouseOwning { hasSoldHouse: "Sold a house in 2010?" boolean hasBoughtHouse: "Bought a house in 2010?" boolean hasMaintLoan: "Did you enter a loan?" boolean if (hasSoldHouse) { sellPrice:


slide-1
SLIDE 1

A Survey Language

form Box1HouseOwning { hasSoldHouse: "Sold a house in 2010?" boolean hasBoughtHouse: "Bought a house in 2010?" boolean hasMaintLoan: "Did you enter a loan?" boolean if (hasSoldHouse) { sellPrice: "Price sold for:" money debt: "Private debts:" money valueResidue: "Residue:" money (sellPrice - debt) } }

1

slide-2
SLIDE 2

A Survey Language

(form Box1HouseOwning [hasSoldHouse "Sold a house in 2010?" boolean] [hasBoughtHouse "Bought a house in 2010?" boolean] [hasMaintLoan "Did you enter a loan?" boolean] (when hasSoldHouse [sellPrice "Price sold for:" money] [debt "Private debts:" money] [valueResidue "Residue:" money (- sellPrice debt)]))

2

slide-3
SLIDE 3

Version 0: Syntactic Abstraction

defnition (define-simple-macro defne a pattern-based macro (form name clause ...) (begin (define name (make-gui 'name)) (form-clause name #t clause) ... (send name start))) use (form Box1 [hasSoldHouse "Sold a house?" boolean] [hasBoughtHouse "Bought a house?" boolean] (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

4

slide-4
SLIDE 4

Version 0: Syntactic Abstraction

defnition (define-simple-macro (form name clause ...) pattern (begin (define name (make-gui 'name)) (form-clause name #t clause) ... (send name start))) use (form Box1 [hasSoldHouse "Sold a house?" boolean] [hasBoughtHouse "Bought a house?" boolean] (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

5

slide-5
SLIDE 5

Version 0: Syntactic Abstraction

defnition (define-simple-macro (form name clause ...) (begin (define name (make-gui 'name)) (form-clause name #t clause) ... (send name start)) template ) use (form Box1 [hasSoldHouse "Sold a house?" boolean] [hasBoughtHouse "Bought a house?" boolean] (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

6

slide-6
SLIDE 6

Version 0: Syntactic Abstraction

defnition (define-simple-macro (form name clause ...) (begin (define name (make-gui 'name)) (form-clause name #t clause) ... (send name start))) use (form Box1 [hasSoldHouse "Sold a house?" boolean] [hasBoughtHouse "Bought a house?" boolean] (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

9

slide-7
SLIDE 7

Version 0: Syntactic Abstraction

defnition (define-simple-macro (form name clause ...) (begin (define name (make-gui 'name)) (form-clause name #t clause) ... (send name start))) use (form Box1 [hasSoldHouse "Sold a house?" boolean] [hasBoughtHouse "Bought a house?" boolean] (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

11

slide-8
SLIDE 8

Version 0: Syntactic Abstraction

defnition (define-syntax (form-clause stx) (syntax-parse stx #:literals (when) [(_ form-name guard (when guard2 nested ...)) #'(begin (form-clause form-name (and guard guard2) nested) ...)] [(_ form-name guard [id question type]) .....] [(_ form-name guard [id question type expr]) .....])) use (form-clause Box1 #t [hasSoldHouse "Sold a house?" boolean]) basic clause (form-clause Box1 #t [hasBoughtHouse "Bought a house?" boolean]) (form-clause Box1 #t (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money])) compound with guard

1

slide-9
SLIDE 9

Version 0: Syntactic Abstraction

defnition (define-syntax defne a macro (form-clause stx) (syntax-parse match multiple patterns #:literals (when) [(_ form-name guard (when guard2 nested ...)) #'(begin (form-clause form-name (and guard guard2) nested) ...)] [(_ form-name guard [id question type]) .....] [(_ form-name guard [id question type expr]) .....])) use (form-clause Box1 #t [hasSoldHouse "Sold a house?" boolean]) (form-clause Box1 #t [hasBoughtHouse "Bought a house?" boolean]) (form-clause Box1 #t (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

14

slide-10
SLIDE 10

Version 0: Syntactic Abstraction

defnition (define-syntax (form-clause stx) (syntax-parse stx #:literals (when) literals [(_ form-name guard (when guard2 nested ...)) #'(begin (form-clause form-name (and guard guard2) nested) ...)] [(_ form-name guard [id question type]) .....] [(_ form-name guard [id question type expr]) .....])) use (form-clause Box1 #t [hasSoldHouse "Sold a house?" boolean]) (form-clause Box1 #t [hasBoughtHouse "Bought a house?" boolean]) (form-clause Box1 #t (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

16

slide-11
SLIDE 11

Version 0: Syntactic Abstraction

defnition (define-syntax (form-clause stx) (syntax-parse stx #:literals (when) [(_ form-name guard (when guard2 nested ...)) #'(begin (form-clause form-name (and guard guard2) nested) ...)] [(_ form-name guard [id question type]) .....] [(_ form-name guard [id question type expr]) .....])) use (form-clause Box1 #t [hasSoldHouse "Sold a house?" boolean]) (form-clause Box1 #t [hasBoughtHouse "Bought a house?" boolean]) (form-clause Box1 #t (when hasSoldHouse [price "Selling price:" money] [debt "Private debts:" money]))

1

slide-12
SLIDE 12

Version 1: Syntactic Extension

#lang racket (provide form (rename-out [boolean-widget boolean] [boolean-money money]) .....) ..... (define-simple-macro (form name clause ...) (begin (define name (make-gui 'name)) (form-clause name #t clause) ... (send

not exported, works anyway: macro scope

name start))) .....

form.rkt

#lang racket (require "form1.rkt") (form Box1 .....)

survey.rkt

21

slide-13
SLIDE 13

Version 2: Module Language

#lang racket (provide form ..... when ..... #%module-begin) .....

form.rkt

#lang s-exp "form2.rkt"

specify language

(form Box1 .....)

house.rkt

2

slide-14
SLIDE 14

Version 2: Module Language

#lang racket (provide form ..... when ..... #%module-begin) .....

form.rkt

#lang s-exp

still using parentheses

"form2.rkt" (form Box1 .....)

house.rkt

24

slide-15
SLIDE 15

Version 2: Module Language

#lang racket (provide form ..... when ..... #%module-begin) .....

form.rkt

#lang s-exp "form2.rkt"

  • nly form2.rkt exports available

(form Box1 .....)

house.rkt

25

slide-16
SLIDE 16

Version 2: Module Language

#lang s-exp "form2.rkt" (form Box1 .....)

house.rkt

#lang racket (provide form ..... when

re-export from racket

..... #%module-begin) .....

form.rkt

26

slide-17
SLIDE 17

Version 2: Module Language

#lang racket (provide form ..... when ..... #%module-begin

macro for whole module body

) .....

form.rkt

#lang s-exp "form2.rkt" (form Box1 .....)

house.rkt

2

slide-18
SLIDE 18

Version 3: Avoiding Duplication

(form Pick [n1 "A number:" number] (when (prime? n1) [n2 "Another number:" number] (when (prime? n2) [n3 "A number:" number])))

expands to

..... (form-clause* Pick #t n1 "A number:" number #f) (form-clause* Pick (and #t (prime? n1)) n2 "A number:" number #f) (form-clause* Pick (and (and #t (prime? n1)) (prime? n2)) n3 "A number:" number #f)

2

slide-19
SLIDE 19

Version 3: Avoiding Duplication

(define-syntax (form-clause stx) (syntax-parse stx #:literals (when) [(_ name guard (when expr nested ...)) #'(begin (define new-guard (lambda () (and (guard) expr))) (form-clause name new-guard nested) ...)] .....))

29

slide-20
SLIDE 20

Version 3: Avoiding Duplication

(form Pick [n1 "A number:" number] (when (prime? n1) [n2 "Another number:" number] (when (prime? n2) [n3 "A number:" number])))

expands to

..... (form-clause* Pick (lambda () #t) n1 "A number:" number #f) (define new-guard1 (lambda () (and ((lambda () #t)) (prime? n1)))) (form-clause* Pick new-guard1 n2 "A number:" number #f) (define new-guard2 (lambda () (and (new-guard1) (prime? n2)))) (form-clause* Pick new-guard2 n3 "A number:" number #f)

slide-21
SLIDE 21

Version 4: Improve Syntax Checking

(define-simple-macro (form name clause ...) (begin (define name (make-gui 'name)) .....))

1

slide-22
SLIDE 22

Version 4: Improve Syntax Checking

(define-syntax (form stx) (syntax-parse stx [(_ name clause ...) #'(begin (define name (make-gui 'name)) .....)]))

2

slide-23
SLIDE 23

Version 4: Improve Syntax Checking

(define-syntax form (lambda (stx) (syntax-parse stx [(_ name clause ...) #'(begin (define name (make-gui 'name)) .....)])))

slide-24
SLIDE 24

Version 4: Improve Syntax Checking

(define-syntax form (lambda (stx) (syntax-parse stx [(_ name clause ...) (unless (identifier? #'name) (raise-syntax-error .....)) #'(begin (define name (make-gui 'name)) .....)])))

4

slide-25
SLIDE 25

Version 5: Types

(form ..... [residue "Value residue:" money hasSoldHouse] .....) boolean shows up in money feld syntax error: `hasSoldHouse' does not have type `money'

slide-26
SLIDE 26

Version 5: Types

(begin-for-syntax

start compile-time code

(define (typed id type) (lambda (stx) ..... #`(has-type #,id #,type) .....))) (define-syntax check-type (lambda (stx) ..... (local-expand #'expr 'expression (list #'has-type)) .....)) (define-syntax form-clause (lambda (stx) ..... [(_ form-name guard-proc [id question type expr]) #'(form-clause* form-name guard-proc id question type (lambda () (check-type expr type)))] .....)) (define-syntax form-clause* (lambda (stx) ..... #'(begin (define val-id undefined) (define-syntax id (typed #'val-id #'type)) .....)))

4

slide-27
SLIDE 27

Version 5: Types

(begin-for-syntax (define (typed id type) (lambda (stx) ..... #`(has-type #,id #,type) .....))

a compile-time function declaration

) (define-syntax check-type (lambda (stx) ..... (local-expand #'expr 'expression (list #'has-type)) .....)) (define-syntax form-clause (lambda (stx) ..... [(_ form-name guard-proc [id question type expr]) #'(form-clause* form-name guard-proc id question type (lambda () (check-type expr type)))] .....)) (define-syntax form-clause* (lambda (stx) ..... #'(begin (define val-id undefined) (define-syntax id (typed #'val-id #'type)) .....)))

41

slide-28
SLIDE 28

Version 5: Types

(begin-for-syntax (define (typed id type) (lambda (stx) ..... #`(has-type #,id #,type) .....))) (define-syntax check-type (lambda (stx) ..... (local-expand #'expr 'expression (list #'has-type)) .....)) (define-syntax form-clause (lambda (stx) ..... [(_ form-name guard-proc [id question type expr]) #'(form-clause* form-name guard-proc id question type (lambda () (check-type expr type)))] .....)) (define-syntax form-clause* (lambda (stx) ..... #'(begin (define val-id undefined) (define-syntax id bind id to a compile-time function (typed #'val-id #'type)) .....)))

42

slide-29
SLIDE 29

Version 5: Types

(begin-for-syntax (define (typed id type) (lambda (stx) ..... #`(has-type #,id #,type) .....))) (define-syntax check-type (lambda (stx) ..... (local-expand #'expr 'expression (list #'has-type)) .....)) (define-syntax form-clause (lambda (stx) ..... [(_ form-name guard-proc [id question type expr]) #'(form-clause* form-name guard-proc id question type (lambda () (check-type check type of expr while expanding expr type)))] .....)) (define-syntax form-clause* (lambda (stx) ..... #'(begin (define val-id undefined) (define-syntax id (typed #'val-id #'type)) .....)))

4

slide-30
SLIDE 30

Version 5: Types

(begin-for-syntax (define (typed id type) (lambda (stx) ..... #`(has-type #,id #,type) .....))) (define-syntax check-type (lambda (stx) ..... (local-expand #'expr 'expression (list #'has-type)) force nested expansion .....)) (define-syntax form-clause (lambda (stx) ..... [(_ form-name guard-proc [id question type expr]) #'(form-clause* form-name guard-proc id question type (lambda () (check-type expr type)))] .....)) (define-syntax form-clause* (lambda (stx) ..... #'(begin (define val-id undefined) (define-syntax id (typed #'val-id #'type)) .....)))

44

slide-31
SLIDE 31

Version 5: Types

(begin-for-syntax (define (typed id type) (lambda (stx) ..... #`(has-type #,id #,type) .....))) (define-syntax check-type (lambda (stx) ..... (local-expand #'expr 'expression (list #'has-type)) .....)) (define-syntax form-clause (lambda (stx) ..... [(_ form-name guard-proc [id question type expr]) #'(form-clause* form-name guard-proc id question type (lambda () (check-type expr type)))] .....)) (define-syntax form-clause* (lambda (stx) ..... #'(begin (define val-id undefined) (define-syntax id (typed #'val-id #'type)) .....)))

= compile time = run time = bridge

45

slide-32
SLIDE 32

Version 6: New Language

#lang reader

import character-level parser...

"reader.rkt" form Box1HouseOwning { hasSoldHouse: "Sold a house in 2010?" boolean hasBoughtHouse: "Bought a house in 2010?" boolean hasMaintLoan: "Did you enter a loan?" boolean if (hasSoldHouse) { sellPrice: "Price sold for:" money debt: "Private debts:" money valueResidue: "Residue:" money (sellPrice - debt) } }

house.svy

4

slide-33
SLIDE 33

Version 6: New Language

#lang reader "reader.rkt"

parses into a module that imports form.rkt

form Box1HouseOwning { hasSoldHouse: "Sold a house in 2010?" boolean hasBoughtHouse: "Bought a house in 2010?" boolean hasMaintLoan: "Did you enter a loan?" boolean if (hasSoldHouse) { sellPrice: "Price sold for:" money debt: "Private debts:" money valueResidue: "Residue:" money (sellPrice - debt) } }

house.svy

4

slide-34
SLIDE 34

Version 6: New Language

#lang reader "reader.rkt" form Box1HouseOwning { hasSoldHouse: "Sold a house in 2010?" boolean hasBoughtHouse: "Bought a house in 2010?" boolean hasMaintLoan: "Did you enter a loan?" boolean if (hasSoldHouse) { sellPrice: "Price sold for:" money debt: "Private debts:" money valueResidue: "Residue:" money (sellPrice - debt) } }

house.svy

#lang racket (require "parser.rkt") (provide read-syntax) (define (read-syntax src in .....) ... (datum->syntax #f `(module house "form.rkt" .....)))

reader.rkt

49

slide-35
SLIDE 35

Version 7: Environment Support

#lang survey-dsl

installed with raco pkg

form Box1HouseOwning { hasSoldHouse: "Sold a house in 2010?" boolean hasBoughtHouse: "Bought a house in 2010?" boolean hasMaintLoan: "Did you enter a loan?" boolean if (hasSoldHouse) { sellPrice: "Price sold for:" money debt: "Private debts:" money valueResidue: "Residue:" money (sellPrice - debt) } }

house.svy

51

slide-36
SLIDE 36

Line Counts

Macros: 150 Operations: 40 Parser: 160 Colorer: 50 GUI: 100 T

  • tal:

500

52