[honu] add syntax_var which is the same as define-syntax

This commit is contained in:
Jon Rafkind 2012-10-09 12:59:16 -06:00
parent 8b627ed8fd
commit 204333fc25
2 changed files with 29 additions and 1 deletions

View File

@ -24,6 +24,7 @@
[honu-function function]
[honu-function fun]
[honu-var var]
[honu-syntax-var syntax_var]
[honu-== ==]
[honu-not-equal !=]
[honu--> %arrow]

View File

@ -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)