use literal sets
This commit is contained in:
parent
99545f8a08
commit
befa88f1ac
|
@ -17,6 +17,7 @@
|
||||||
(for-template "private/literals.rkt")
|
(for-template "private/literals.rkt")
|
||||||
(for-syntax "private/more.ss")
|
(for-syntax "private/more.ss")
|
||||||
(for-syntax "private/syntax.ss")
|
(for-syntax "private/syntax.ss")
|
||||||
|
(for-syntax "private/macro.ss")
|
||||||
"private/macro.ss")
|
"private/macro.ss")
|
||||||
|
|
||||||
(define test-x-class
|
(define test-x-class
|
||||||
|
@ -26,7 +27,7 @@
|
||||||
|
|
||||||
(define x (new test-x-class [tuna 5]))
|
(define x (new test-x-class [tuna 5]))
|
||||||
|
|
||||||
(define (sql1) #f)
|
(define (sql1 . x) #f)
|
||||||
(define (sql2) #f)
|
(define (sql2) #f)
|
||||||
(define (sql3) #f)
|
(define (sql3) #f)
|
||||||
(define (sql4) #f)
|
(define (sql4) #f)
|
||||||
|
@ -63,12 +64,13 @@
|
||||||
with-syntax
|
with-syntax
|
||||||
quote
|
quote
|
||||||
#%app
|
#%app
|
||||||
#%parens
|
#%parens #%brackets #%braces
|
||||||
...
|
...
|
||||||
map
|
map
|
||||||
syntax->list
|
syntax->list
|
||||||
identifier
|
identifier
|
||||||
expression
|
expression
|
||||||
|
statement
|
||||||
(rename-out (semicolon \;
|
(rename-out (semicolon \;
|
||||||
)
|
)
|
||||||
(ellipses-comma ec)
|
(ellipses-comma ec)
|
||||||
|
@ -76,6 +78,7 @@
|
||||||
#;
|
#;
|
||||||
(honu-identifier identifier)
|
(honu-identifier identifier)
|
||||||
(expression-comma expression_comma)
|
(expression-comma expression_comma)
|
||||||
|
(honu-macro macro)
|
||||||
(parse-an-expr parse)
|
(parse-an-expr parse)
|
||||||
(... scheme:...)
|
(... scheme:...)
|
||||||
(honu-body:class body)
|
(honu-body:class body)
|
||||||
|
@ -84,6 +87,7 @@
|
||||||
(honu-+ +)
|
(honu-+ +)
|
||||||
(honu-scheme scheme2)
|
(honu-scheme scheme2)
|
||||||
(scheme-syntax scheme:syntax)
|
(scheme-syntax scheme:syntax)
|
||||||
|
(scheme-syntax schemeSyntax)
|
||||||
))
|
))
|
||||||
#%braces #%parens #%brackets
|
#%braces #%parens #%brackets
|
||||||
x
|
x
|
||||||
|
@ -92,6 +96,10 @@
|
||||||
display
|
display
|
||||||
display2
|
display2
|
||||||
newline
|
newline
|
||||||
|
;; stuff i done want
|
||||||
|
define
|
||||||
|
let
|
||||||
|
;; end stuff
|
||||||
else
|
else
|
||||||
#%app
|
#%app
|
||||||
quote
|
quote
|
||||||
|
@ -99,7 +107,10 @@
|
||||||
foobar2000
|
foobar2000
|
||||||
expression
|
expression
|
||||||
str
|
str
|
||||||
(for-template #%parens)
|
define-struct
|
||||||
|
#;
|
||||||
|
(for-template #%parens #%brackets #%braces)
|
||||||
|
;; (for-meta 2 (rename-out (honu-syntax syntax)))
|
||||||
(rename-out
|
(rename-out
|
||||||
(honu-if if)
|
(honu-if if)
|
||||||
(honu-provide provide)
|
(honu-provide provide)
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
"ops.ss"
|
"ops.ss"
|
||||||
"syntax.ss"
|
"syntax.ss"
|
||||||
"parse.ss"
|
"parse.ss"
|
||||||
|
"literals.ss"
|
||||||
)
|
)
|
||||||
"literals.ss"
|
"literals.ss"
|
||||||
;; "typed-utils.ss"
|
;; "typed-utils.ss"
|
||||||
|
@ -501,6 +502,15 @@ if (foo){
|
||||||
[(_ expr ...)
|
[(_ expr ...)
|
||||||
(parse-an-expr #'(expr ...))]))
|
(parse-an-expr #'(expr ...))]))
|
||||||
|
|
||||||
|
(define-honu-syntax scheme-syntax
|
||||||
|
(lambda (body ctx)
|
||||||
|
(syntax-parse body
|
||||||
|
[(_ expr . rest)
|
||||||
|
(values
|
||||||
|
(lambda ()
|
||||||
|
(apply-scheme-syntax #'#'expr))
|
||||||
|
#'rest)])))
|
||||||
|
|
||||||
(define-honu-syntax honu-provide
|
(define-honu-syntax honu-provide
|
||||||
(lambda (body ctx)
|
(lambda (body ctx)
|
||||||
(syntax-parse body #:literals (semicolon)
|
(syntax-parse body #:literals (semicolon)
|
||||||
|
@ -547,7 +557,7 @@ if (foo){
|
||||||
#'rest)])))
|
#'rest)])))
|
||||||
|
|
||||||
(define-syntax (honu-unparsed-begin stx)
|
(define-syntax (honu-unparsed-begin stx)
|
||||||
(printf "honu unparsed begin: ~a\n" (syntax->datum stx))
|
(printf "honu unparsed begin: ~a at phase ~a\n" (syntax->datum stx) (syntax-local-phase-level))
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[(_) #'(void)]
|
[(_) #'(void)]
|
||||||
[(_ . body)
|
[(_ . body)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#lang racket
|
#lang racket
|
||||||
|
|
||||||
(provide (all-defined-out))
|
(provide (all-defined-out))
|
||||||
|
(require syntax/parse)
|
||||||
|
|
||||||
;; macro for defining literal tokens that can be used in macros
|
;; macro for defining literal tokens that can be used in macros
|
||||||
(define-syntax-rule (define-literal name ...)
|
(define-syntax-rule (define-literal name ...)
|
||||||
|
@ -18,3 +19,5 @@
|
||||||
honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->=
|
honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->=
|
||||||
honu-? honu-: honu-comma honu-. #%braces #%brackets #%parens colon
|
honu-? honu-: honu-comma honu-. #%braces #%brackets #%parens colon
|
||||||
ellipses-comma ellipses-comma* ellipses-repeat honu-for-syntax)
|
ellipses-comma ellipses-comma* ellipses-repeat honu-for-syntax)
|
||||||
|
|
||||||
|
(define-literal-set cruft (#%parens #%brackets #%braces semicolon))
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
"contexts.ss"
|
"contexts.ss"
|
||||||
"parse.ss"
|
"parse.ss"
|
||||||
"syntax.ss"
|
"syntax.ss"
|
||||||
|
"literals.rkt"
|
||||||
"honu-typed-scheme.ss"
|
"honu-typed-scheme.ss"
|
||||||
scheme/base
|
scheme/base
|
||||||
syntax/parse
|
syntax/parse
|
||||||
|
@ -430,7 +431,8 @@
|
||||||
|
|
||||||
(define-honu-syntax honu-pattern
|
(define-honu-syntax honu-pattern
|
||||||
(lambda (stx ctx)
|
(lambda (stx ctx)
|
||||||
(syntax-parse stx #:literals (#%parens #%brackets semicolon)
|
(syntax-parse stx #:literal-sets ([cruft #:at stx])
|
||||||
|
;; #%parens #%brackets semicolon)
|
||||||
[(_ name (#%parens all-attributes:identifier ...) (#%brackets xpattern ...)
|
[(_ name (#%parens all-attributes:identifier ...) (#%brackets xpattern ...)
|
||||||
semicolon . rest)
|
semicolon . rest)
|
||||||
(define my-parens (datum->syntax #'name '#%parens #'name #'name))
|
(define my-parens (datum->syntax #'name '#%parens #'name #'name))
|
||||||
|
@ -445,28 +447,38 @@
|
||||||
[parens (datum->syntax #'name '#%parens #'name #'name)])
|
[parens (datum->syntax #'name '#%parens #'name #'name)])
|
||||||
(syntax/loc stx
|
(syntax/loc stx
|
||||||
(define-splicing-syntax-class name
|
(define-splicing-syntax-class name
|
||||||
#:literals (parens)
|
#:literal-sets ([cruft #:at name])
|
||||||
#:attributes (all-attributes ...)
|
#:attributes (all-attributes ...)
|
||||||
final-pattern))))
|
final-pattern))))
|
||||||
#'rest)])))
|
#'rest)])))
|
||||||
|
|
||||||
|
(define foobar 0)
|
||||||
|
|
||||||
(define-honu-syntax honu-macro
|
(define-honu-syntax honu-macro
|
||||||
(lambda (stx ctx)
|
(lambda (stx ctx)
|
||||||
(define-syntax-class honu-macro3
|
(define-syntax-class honu-macro3
|
||||||
#:literals (#%parens #%braces)
|
;; #:literals (#%parens #%braces)
|
||||||
|
#:literal-sets ([cruft ;;#:at stx
|
||||||
|
#:phase (syntax-local-phase-level)
|
||||||
|
])
|
||||||
[pattern (_ name (#%parens literals ...)
|
[pattern (_ name (#%parens literals ...)
|
||||||
(#%braces template ...) (#%braces code ...)
|
(#%braces template ...) (#%braces code ...)
|
||||||
. rest)
|
. rest)
|
||||||
#:with result
|
#:with result
|
||||||
(list
|
(list
|
||||||
(with-syntax ([(fixed ...) (fix-template #'(template ...))]
|
(with-syntax ([(fixed ...) (fix-template #'(template ...))]
|
||||||
|
[first-pattern (stx-car #'(template ...))]
|
||||||
|
#;
|
||||||
|
[your-bracket (datum->syntax #'name '#%brackets #'name)]
|
||||||
|
#;
|
||||||
|
[your-braces (datum->syntax #'name '#%braces #'name)]
|
||||||
|
#;
|
||||||
[your-parens (datum->syntax #'name '#%parens #'name)])
|
[your-parens (datum->syntax #'name '#%parens #'name)])
|
||||||
|
|
||||||
#;
|
#;
|
||||||
#'(define-honu-syntax name
|
#'(define-honu-syntax name
|
||||||
(lambda (stx ctx)
|
(lambda (stx ctx)
|
||||||
(syntax-parse stx #:literals (your-parens literals ...)
|
(syntax-parse stx #:literals (your-parens your-bracket literals ...)
|
||||||
[(fixed ... rrest (... ...))
|
[(fixed ... rrest (... ...))
|
||||||
(values
|
(values
|
||||||
#;
|
#;
|
||||||
|
@ -481,7 +493,10 @@
|
||||||
(syntax/loc stx
|
(syntax/loc stx
|
||||||
(define-honu-syntax name
|
(define-honu-syntax name
|
||||||
(lambda (stx ctx)
|
(lambda (stx ctx)
|
||||||
(syntax-parse stx #:literals (your-parens literals ...)
|
(printf "Executing macro `~a' on input `~a'\n" 'name (syntax->datum stx))
|
||||||
|
(syntax-parse stx
|
||||||
|
#:literal-sets ([cruft #:at name])
|
||||||
|
#:literals (foobar literals ...)
|
||||||
[(fixed ... rrest (... ...))
|
[(fixed ... rrest (... ...))
|
||||||
(values
|
(values
|
||||||
#;
|
#;
|
||||||
|
@ -595,7 +610,7 @@
|
||||||
#'rrest))]))))
|
#'rrest))]))))
|
||||||
#'rest))])
|
#'rest))])
|
||||||
(printf "Executing honu macro\n")
|
(printf "Executing honu macro\n")
|
||||||
(syntax-parse stx #:literals (#%parens #%braces)
|
(syntax-parse stx
|
||||||
[out:honu-macro1 (apply (lambda (a b) (values (lambda () a) b)) (syntax->list (attribute out.result)))]
|
[out:honu-macro1 (apply (lambda (a b) (values (lambda () a) b)) (syntax->list (attribute out.result)))]
|
||||||
[out:honu-macro3 (apply (lambda (a b) (values (lambda () a) b)) (syntax->list (attribute out.result)))]
|
[out:honu-macro3 (apply (lambda (a b) (values (lambda () a) b)) (syntax->list (attribute out.result)))]
|
||||||
[out:honu-macro2 (apply (lambda (a b) (values (lambda () a) b)) (syntax->list (attribute out.result)))]
|
[out:honu-macro2 (apply (lambda (a b) (values (lambda () a) b)) (syntax->list (attribute out.result)))]
|
||||||
|
|
|
@ -180,7 +180,7 @@
|
||||||
(define-syntax-rule (honu-syntax-maker maker unparsed)
|
(define-syntax-rule (honu-syntax-maker maker unparsed)
|
||||||
(define-honu-syntax maker
|
(define-honu-syntax maker
|
||||||
(lambda (stx ctx)
|
(lambda (stx ctx)
|
||||||
(syntax-parse stx #:literals (semicolon #%parens)
|
(syntax-parse stx #:literal-sets ([cruft #:at unparsed])
|
||||||
[(_ (#%parens expr (... ...)) semicolon . rest)
|
[(_ (#%parens expr (... ...)) semicolon . rest)
|
||||||
(values
|
(values
|
||||||
(lambda ()
|
(lambda ()
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
#:attrs (result)
|
#:attrs (result)
|
||||||
#:description "honu-expr"
|
#:description "honu-expr"
|
||||||
(lambda (stx fail)
|
(lambda (stx fail)
|
||||||
(printf "Honu expr from transformer ~a in context ~a\n" (syntax->datum stx) context)
|
(printf "Honu expr from transformer `~a' in context ~a transformer ~a\n" (syntax->datum stx) context (get-transformer stx))
|
||||||
(cond
|
(cond
|
||||||
[(stx-null? stx) (fail)]
|
[(stx-null? stx) (fail)]
|
||||||
#;
|
#;
|
||||||
|
@ -336,7 +336,7 @@
|
||||||
[pattern ((~var e (ternary context))
|
[pattern ((~var e (ternary context))
|
||||||
(~var x1 (debug-here (format "expression top 1 ~a\n" (syntax->datum #'e))))
|
(~var x1 (debug-here (format "expression top 1 ~a\n" (syntax->datum #'e))))
|
||||||
semicolon
|
semicolon
|
||||||
(~var x2 (debug-here "2"))
|
(~var x2 (debug-here "expression top 2"))
|
||||||
. rest)
|
. rest)
|
||||||
#:with result #'e.result])
|
#:with result #'e.result])
|
||||||
|
|
||||||
|
@ -432,6 +432,27 @@
|
||||||
[pattern (~seq (~var x (expression-1 the-expression-context)))
|
[pattern (~seq (~var x (expression-1 the-expression-context)))
|
||||||
#:with result (apply-scheme-syntax #'x.result)])
|
#:with result (apply-scheme-syntax #'x.result)])
|
||||||
|
|
||||||
|
(define-splicing-syntax-class (whats-here? hm)
|
||||||
|
[pattern (~seq x)
|
||||||
|
#:when (begin (printf "Whats at `~a': `~a'\n" hm #'x)
|
||||||
|
#f)])
|
||||||
|
|
||||||
|
(define-syntax-class statement
|
||||||
|
[pattern (~var x (expression-top the-top-block-context))
|
||||||
|
#:with result (apply-scheme-syntax (attribute x.result))
|
||||||
|
#:with rest #'x.rest])
|
||||||
|
|
||||||
|
#;
|
||||||
|
(define-splicing-syntax-class statement
|
||||||
|
[pattern (~seq
|
||||||
|
(~optional (~var zz (whats-here? "statement")))
|
||||||
|
(~var d1 (debug-here (format "statement 1\n")))
|
||||||
|
(~var x (expression-top the-top-block-context))
|
||||||
|
(~var d2 (debug-here (format "statement 2\n")))
|
||||||
|
)
|
||||||
|
#:with result (apply-scheme-syntax #'x.result)
|
||||||
|
#:with rest #'x.rest])
|
||||||
|
|
||||||
(define-splicing-syntax-class expression-comma
|
(define-splicing-syntax-class expression-comma
|
||||||
#:literals (honu-comma)
|
#:literals (honu-comma)
|
||||||
#;
|
#;
|
||||||
|
@ -454,7 +475,7 @@
|
||||||
(define (parse-an-expr stx)
|
(define (parse-an-expr stx)
|
||||||
(printf "Parse an expr ~a\n" (syntax->datum stx))
|
(printf "Parse an expr ~a\n" (syntax->datum stx))
|
||||||
(syntax-parse (with-syntax ([(s ...) stx])
|
(syntax-parse (with-syntax ([(s ...) stx])
|
||||||
#'(s ... semicolon))
|
#'(s ...))
|
||||||
#;
|
#;
|
||||||
[(raw:raw-scheme-syntax . rest) #'raw]
|
[(raw:raw-scheme-syntax . rest) #'raw]
|
||||||
[((~var expr (expression-1 the-expression-context)) . rest) #'expr.result]
|
[((~var expr (expression-1 the-expression-context)) . rest) #'expr.result]
|
||||||
|
@ -555,10 +576,6 @@
|
||||||
(and (positive? (string-length str))
|
(and (positive? (string-length str))
|
||||||
(memq (string-ref str 0) sym-chars)))))))
|
(memq (string-ref str 0) sym-chars)))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; returns a transformer or #f
|
;; returns a transformer or #f
|
||||||
(define (get-transformer stx)
|
(define (get-transformer stx)
|
||||||
;; if its an identifier and bound to a transformer return it
|
;; if its an identifier and bound to a transformer return it
|
||||||
|
@ -566,7 +583,6 @@
|
||||||
(and (stx-pair? stx)
|
(and (stx-pair? stx)
|
||||||
(identifier? (stx-car stx))
|
(identifier? (stx-car stx))
|
||||||
(let ([v (begin
|
(let ([v (begin
|
||||||
#;
|
|
||||||
(printf "Transformer is ~a. Local value is ~a\n" (stx-car stx) (syntax-local-value (stx-car stx) (lambda () #f)))
|
(printf "Transformer is ~a. Local value is ~a\n" (stx-car stx) (syntax-local-value (stx-car stx) (lambda () #f)))
|
||||||
(syntax-local-value (stx-car stx) (lambda () #f)))])
|
(syntax-local-value (stx-car stx) (lambda () #f)))])
|
||||||
(and (honu-transformer? v) v))))
|
(and (honu-transformer? v) v))))
|
||||||
|
@ -596,8 +612,9 @@
|
||||||
(let ([v (syntax-local-value (stx-car first) (lambda () #f))])
|
(let ([v (syntax-local-value (stx-car first) (lambda () #f))])
|
||||||
(and (honu-transformer? v) v))]
|
(and (honu-transformer? v) v))]
|
||||||
[else #f]))))
|
[else #f]))))
|
||||||
#;
|
|
||||||
(printf "~a bound transformer? ~a\n" stx (bound-transformer stx))
|
(printf "~a bound transformer? ~a\n" stx (bound-transformer stx))
|
||||||
|
(bound-transformer stx)
|
||||||
|
#;
|
||||||
(or (bound-transformer stx)
|
(or (bound-transformer stx)
|
||||||
(special-transformer stx)))
|
(special-transformer stx)))
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#;
|
#;
|
||||||
(define honu-scheme-syntax (gensym))
|
(define honu-scheme-syntax (gensym))
|
||||||
|
|
||||||
|
#;
|
||||||
(define-syntax-rule (scheme-syntax stx)
|
(define-syntax-rule (scheme-syntax stx)
|
||||||
(syntax-property (syntax stx) honu-scheme-syntax #t))
|
(syntax-property (syntax stx) honu-scheme-syntax #t))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user