From d05ac2ac6a16c536e9406d0e1630d4d031e24bb5 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Mon, 9 Jul 2018 10:55:09 -0600 Subject: [PATCH] precalc --- .../algebra-demo/grammar.rkt | 10 ++--- beautiful-racket-demo/algebra-demo/main.rkt | 7 ++- .../precalc-demo/grammar.rkt | 11 +++++ beautiful-racket-demo/precalc-demo/main.rkt | 43 +++++++++++++++++++ beautiful-racket-demo/precalc-demo/test.rkt | 18 ++++++++ 5 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 beautiful-racket-demo/precalc-demo/grammar.rkt create mode 100644 beautiful-racket-demo/precalc-demo/main.rkt create mode 100644 beautiful-racket-demo/precalc-demo/test.rkt diff --git a/beautiful-racket-demo/algebra-demo/grammar.rkt b/beautiful-racket-demo/algebra-demo/grammar.rkt index e29a9e5..7ff8428 100644 --- a/beautiful-racket-demo/algebra-demo/grammar.rkt +++ b/beautiful-racket-demo/algebra-demo/grammar.rkt @@ -1,9 +1,9 @@ #lang brag top : (func-def | func-app)* -func-def : /"fun" var /"(" boundvars /")" /"=" expr -/boundvars : var [/"," var] -expr : var "+" var | func-app -func-app : var /"(" arg [/"," arg] /")" +func-def : /"fun" var /"(" vars /")" /"=" expr +/vars : var [/"," var] +expr : var "+" var | value +@value : var | INT | func-app +func-app : var /"(" value [/"," value] /")" @var : ID -@arg : var | INT \ No newline at end of file diff --git a/beautiful-racket-demo/algebra-demo/main.rkt b/beautiful-racket-demo/algebra-demo/main.rkt index bf9bfe2..2ccbcf2 100644 --- a/beautiful-racket-demo/algebra-demo/main.rkt +++ b/beautiful-racket-demo/algebra-demo/main.rkt @@ -17,15 +17,14 @@ (define-macro top #'begin) -(define-macro (func-def ID ARGIDS EXPR) - #'(define ID (λ ARGIDS EXPR))) +(define-macro (func-def VAR VARS EXPR) + #'(define VAR (λ VARS EXPR))) (define-macro-cases expr [(_ LEFT "+" RIGHT) #'(+ LEFT RIGHT)] [(_ OTHER) #'OTHER]) -(define-macro (func-app ID ARG ...) - #'(ID ARG ...)) +(define-macro func-app #'#%app) (define (read-syntax src ip) (define token-thunk (λ () (lex ip))) diff --git a/beautiful-racket-demo/precalc-demo/grammar.rkt b/beautiful-racket-demo/precalc-demo/grammar.rkt new file mode 100644 index 0000000..c7c94ec --- /dev/null +++ b/beautiful-racket-demo/precalc-demo/grammar.rkt @@ -0,0 +1,11 @@ +#lang brag + +top : (func-def | expr)* +func-def : /"fun" var /"(" vars /")" /"=" expr +/vars : [var [/"," var]*] +@expr : sum +sum : [sum ("+" | "-")] product +product : [product ("*" | "/")] value +@value : var | INT | func-app | /"(" expr /")" +func-app : var /"(" [value [/"," value]*] /")" +@var : ID \ No newline at end of file diff --git a/beautiful-racket-demo/precalc-demo/main.rkt b/beautiful-racket-demo/precalc-demo/main.rkt new file mode 100644 index 0000000..801628f --- /dev/null +++ b/beautiful-racket-demo/precalc-demo/main.rkt @@ -0,0 +1,43 @@ +#lang br/quicklang +(require brag/support "grammar.rkt") +(provide (all-defined-out) #%module-begin) + +(module+ reader + (provide read-syntax)) + +(define-lex-abbrev reserved-toks + (:or "fun" "(" ")" "=" "+" "*" "/" "-" ",")) + +(define lex + (lexer + [(:or (from/to "//" "\n") (from/to "/*" "*/")) (token 'COMMENT #:skip? #t)] + [whitespace (lex input-port)] + [reserved-toks lexeme] + [alphabetic (token 'ID (string->symbol lexeme))] + [(:+ (char-set "0123456789")) (token 'INT (string->number lexeme))])) + +(define-macro top #'begin) + +(define-macro (func-def ID ARGIDS EXPR) + #'(define ID (λ ARGIDS EXPR))) + +(define-macro-cases sum + [(_ LEFT "+" RIGHT) #'(+ LEFT RIGHT)] + [(_ LEFT "-" RIGHT) #'(- LEFT RIGHT)] + [(_ OTHER) #'OTHER]) + +(define-macro-cases product + [(_ LEFT OP-STR RIGHT) + (with-syntax ([OP (string->symbol (syntax->datum #'OP-STR))]) + #'(OP LEFT RIGHT))] + [(_ OTHER) #'OTHER]) + +(define-macro func-app #'#%app) + +(define (read-syntax src ip) + (define token-thunk (λ () (lex ip))) + (define parse-tree (parse token-thunk)) + (strip-context + (with-syntax ([PT parse-tree]) + #'(module mod-name precalc-demo + PT)))) \ No newline at end of file diff --git a/beautiful-racket-demo/precalc-demo/test.rkt b/beautiful-racket-demo/precalc-demo/test.rkt new file mode 100644 index 0000000..894270a --- /dev/null +++ b/beautiful-racket-demo/precalc-demo/test.rkt @@ -0,0 +1,18 @@ +#lang precalc-demo +fun f(x, y, z) = x + x + x * (y + y) + y * z - z - z + +fun g(z) = f(z, z, z) // line comment +g(10) // 300 + +fun h() = g(10) +h() // also 300 + +fun k(x) = x / 10 / 10 / (x / x) +k(h()) // 3 + +36/6/2 // 3 + +/* +multiline comment +0 / 0 / 0 +*/