diff --git a/collects/honu/core/main.rkt b/collects/honu/core/main.rkt index e3307a3f4e..ddc1b05567 100644 --- a/collects/honu/core/main.rkt +++ b/collects/honu/core/main.rkt @@ -24,6 +24,7 @@ [honu-function function] [honu-function fun] [honu-var var] + [honu-syntax-var syntax_var] [honu-== ==] [honu-not-equal !=] [honu--> %arrow] diff --git a/collects/honu/core/private/honu2.rkt b/collects/honu/core/private/honu2.rkt index 07e1017a69..bb8ed7ec80 100644 --- a/collects/honu/core/private/honu2.rkt +++ b/collects/honu/core/private/honu2.rkt @@ -108,7 +108,7 @@ (debug "Parse expression ~a\n" (pretty-format (syntax->datum #'(stuff ...)))) (define-values (parsed unparsed) (parse #'(stuff ...))) - (with-syntax ([parsed* (honu->racket parsed)] + (with-syntax ([parsed* parsed] [unparsed unparsed]) (emit-local-step parsed #'parsed* #:id #'honu-parse-expression) (debug "Parsed ~a. Unparsed ~a\n" #'parsed #'unparsed) @@ -411,6 +411,22 @@ #:with (name ...) #'(variables.id ...) #:with expression #'one.result])) +(begin-for-syntax + (provide honu-declaration/phase+1) + + ;; parses a declaration + ;; var x = 9 + ;; var a, b, c = values(1 + 2, 5, 9) + (define-splicing-syntax-class honu-declaration/phase+1 + #:literal-sets (cruft) + #:literals (honu-syntax-var) + [pattern (~seq honu-syntax-var (~var variables (separate-ids (literal-syntax-class honu-comma) + (literal-syntax-class honu-equal))) + honu-equal one:honu-expression/phase+1) + #:with (name ...) #'(variables.id ...) + #:with expression #'one.result])) + +;; like define (provide honu-var) (define-honu-syntax honu-var (lambda (code) @@ -421,6 +437,17 @@ (racket-syntax (define-values (var.name ...) (let () var.expression)))) (values result #'rest #t)]))) +;; like define-syntax +(provide honu-syntax-var) +(define-honu-syntax honu-syntax-var + (lambda (code) + (syntax-parse code #:literal-sets (cruft) + [(var:honu-declaration/phase+1 . rest) + (define result + ;; wrap the expression in a let so that we can insert new `define-syntax'es + (racket-syntax (define-syntaxes (var.name ...) (let () var.expression)))) + (values result #'rest #t)]))) + (provide (rename-out [honu-with-syntax withSyntax])) (define-honu-syntax honu-with-syntax (lambda (code)