Jon Rafkind 1 Honu is 2 Honu is Macros are 3 Infix syntax - - PowerPoint PPT Presentation

jon rafkind
SMART_READER_LITE
LIVE PREVIEW

Jon Rafkind 1 Honu is 2 Honu is Macros are 3 Infix syntax - - PowerPoint PPT Presentation

Jon Rafkind 1 Honu is 2 Honu is Macros are 3 Infix syntax #lang honu function loadImages(path, files){ binary_operator + 1 'left string_append [make_bitmap(path + file): file = files] } loadImages(root, ["a.png",


slide-1
SLIDE 1

Jon Rafkind

1

slide-2
SLIDE 2

Honu is

2

slide-3
SLIDE 3

Honu is Macros are

3

slide-4
SLIDE 4

Infix syntax #lang honu function loadImages(path, files){ binary_operator + 1 'left string_append [make_bitmap(path + file): file = files] } loadImages(root, ["a.png", "b.png", "c.png"])

4

slide-5
SLIDE 5

XML as a macro #lang honu macro xml ... var data = xml <record> <name> { get_name(person) } </name> <age> { get_age(person) } </age> <address> { get_address(person) } </address> </record>

5

slide-6
SLIDE 6

Racket parsing Read Expand

s-expression characters program

(let ([x 5]) (+ x 5)) () let () [] x 5 () + x 5

6

slide-7
SLIDE 7

Racket parsing Read Expand

s-expression characters program

(let ([x 5]) (+ x 5)) () let () [] x 5 () + x 5

Honu parsing Read Enforest Expand

terms program unparsed terms s-expression characters

f(x) * 2 + 1 () f () x * 2 + 1 + * f (x) 2 1

7

slide-8
SLIDE 8

Honu expansion

Enforest function c_to_f(temp){ temp * 9/5 + 32 } printf("temperature ~a", c_to_f(40))

8

slide-9
SLIDE 9

Honu expansion

Enforest function c_to_f(temp){ temp * 9/5 + 32 } printf("temperature ~a", c_to_f(40)) Expand <function>, printf("temperature ~a", c_to_f(40))

9

slide-10
SLIDE 10

Honu expansion

Enforest function c_to_f(temp){ temp * 9/5 + 32 } printf("temperature ~a", c_to_f(40)) Expand <function>, printf("temperature ~a", c_to_f(40)) Enforest printf("temperature ~a", c_to_f(40))

10

slide-11
SLIDE 11

Honu expansion

Enforest function c_to_f(temp){ temp * 9/5 + 32 } printf("temperature ~a", c_to_f(40)) Expand <function>, printf("temperature ~a", c_to_f(40)) Enforest printf("temperature ~a", c_to_f(40)) Done <function>, <call>

11

slide-12
SLIDE 12

Honu grammar Expression := <literal> | <identifier> | <unary> <expression> | <expression> <unary> | <expression> <binary> <expression> | <expression> ( <expression, ... ) | ( <expression> ) | <expression> [ <expression> ] | [ <expression> , ... ] | [ <expression> : <expresion> = <expression> ] | { <sequence> ... } | <identifier> <term> ...

12

slide-13
SLIDE 13

Honu grammar Expression := <literal> | <identifier> | <unary> <expression> | <expression> <unary> | <expression> <binary> <expression> | <expression> ( <expression, ... ) | ( <expression> ) | <expression> [ <expression> ] | [ <expression> , ... ] | [ <expression> : <expresion> = <expression> ] | { <sequence> ... } | <identifier> <term> ... List comprehension Function call

13

slide-14
SLIDE 14

Honu grammar Expression := <literal> | <identifier> | <unary> <expression> | <expression> <unary> | <expression> <binary> <expression> | <expression> ( <expression, ... ) | ( <expression> ) | <expression> [ <expression> ] | [ <expression> , ... ] | [ <expression> : <expresion> = <expression> ] | { <sequence> ... } | <identifier> <term> ... Macro Operators

14

slide-15
SLIDE 15

Macros

Definition

macro name(literal ...){ pattern ... }{ body ... }

Use

macro withCloser(=){name:id = e:expression { body ... }}{ syntax({ var name = e body ... name.close() }) }

In action

withCloser d = getDatabase() { ... } printf("Done")

15

slide-16
SLIDE 16

Patterns

macro withCloser(){ name:id = e:expression { body ... } }{ syntax({ var name = e body ... name.close() }) }

16

slide-17
SLIDE 17

Patterns

macro withCloser(){ name:id = e:expression { body ... } }{ syntax({ var name = e body ... name.close() }) } id expression

Identifier pattern Expression pattern

17

slide-18
SLIDE 18

Patterns

macro withCloser(){ name:id = e:expression { body ... } }{ syntax({ var name = e body ... name.close() }) } id expression

Identifier pattern Expression pattern expression = enforest(terms)

18

slide-19
SLIDE 19

Patterns

pattern letvar(=){name:id = expr:expression}

19

slide-20
SLIDE 20

Patterns

pattern letvar(=){name:id = expr:expression} Definition macro let(){ v:letvar ... { body ... } }{ /* ..implementation.. */ }

20

slide-21
SLIDE 21

Patterns

pattern letvar(=){name:id = expr:expression} Definition macro let(){ v:letvar ... { body ... } }{ syntax({ $ var v_name = v_expr $ ... body ... }) } Use let day = getDay() month = getMonth() { printf("~a\n", is_christmas(day, month)) }

21

slide-22
SLIDE 22

Racket Honu Bridge

(require honu/core/api honu) (define-honu-macro xml (lambda (stx) ))

22

slide-23
SLIDE 23

Racket Honu Bridge

(require honu/core/api honu) (define-honu-macro xml (lambda (stx) (syntax-parse stx [(..stuff.. . rest) (values (racket-syntax ..new-stx..) #'rest #t)])))

23

slide-24
SLIDE 24

Operators

Definition binary_operator logbase 4 'left function(left right){ log(left) / log(right) } Use 2 * 12 logbase 4 + 8

24

slide-25
SLIDE 25

Infix enforest

macro call(){ object:id . method:id(arg:expression ...)}{} 1 + call plane.passengers() * 5

25

slide-26
SLIDE 26

Infix enforest

macro call(){ object:id . method:id(arg:expression ...)}{} 1 + call plane.passengers() * 5 1 Parse State

26

slide-27
SLIDE 27

Infix enforest

macro call(){ object:id . method:id(arg:expression ...)}{} 1 + call plane.passengers() * 5 1 + Parse State a = function (right){ mkOp(+, 1, right) }

27

slide-28
SLIDE 28

Infix enforest

macro call(){ object:id . method:id(arg:expression ...)}{} 1 + call plane.passengers() * 5 1 + call plane.passengers() Parse State a = function (right){ mkOp(+, 1, right) }

28

slide-29
SLIDE 29

Infix enforest

macro call(){ object:id . method:id(arg:expression ...)}{} 1 + call plane.passengers() * 5 1 + call plane.passengers() * Parse State a = function (right){ mkOp(+, 1, right) } b = function (right){ mkOp(*, <call>, right) }

29

slide-30
SLIDE 30

Infix enforest

macro call(){ object:id . method:id(arg:expression ...)}{} 1 + call plane.passengers() * 5 1 + call plane.passengers() * 5 Parse State a = function (right){ mkOp(+, 1, right) } b = function (right){ mkOp(*, <call>, right) } a(b(5))

30

slide-31
SLIDE 31

#lang honu Thank you

31