Dealing with syntax by punting

svn: r6663
This commit is contained in:
Jay McCarthy 2007-06-14 20:25:46 +00:00
parent ae43910cd7
commit 9cec27f49b
9 changed files with 81 additions and 39 deletions

View File

@ -64,15 +64,9 @@
(syntax/loc stx (syntax/loc stx
(define-values (v ...) ve)))] (define-values (v ...) ve)))]
[(define-syntaxes (v ...) ve) [(define-syntaxes (v ...) ve)
(parameterize ([transformer? #t]) stx]
(with-syntax ([ve (anormal-term #'ve)])
(syntax/loc stx
(define-syntaxes (v ...) ve))))]
[(define-values-for-syntax (v ...) ve) [(define-values-for-syntax (v ...) ve)
(parameterize ([transformer? #t]) stx]
(with-syntax ([ve (anormal-term #'ve)])
(syntax/loc stx
(define-values-for-syntax (v ...) ve))))]
[(set! v ve) [(set! v ve)
(anormal (anormal
(compose ctxt (compose ctxt

View File

@ -33,15 +33,11 @@
(values (quasisyntax/loc stx (define-values (v ...) #,nve)) (values (quasisyntax/loc stx (define-values (v ...) #,nve))
defs))] defs))]
[(define-syntaxes (v ...) ve) [(define-syntaxes (v ...) ve)
(parameterize ([transformer? #t]) (values stx
(let-values ([(nve defs) (defun #'ve)]) empty)]
(values (quasisyntax/loc stx (define-syntaxes (v ...) #,nve))
defs)))]
[(define-values-for-syntax (v ...) ve) [(define-values-for-syntax (v ...) ve)
(parameterize ([transformer? #t]) (values stx
(let-values ([(nve defs) (defun #'ve)]) empty)]
(values (quasisyntax/loc stx (define-values-for-syntax (v ...) #,nve))
defs)))]
[(set! v ve) [(set! v ve)
(let-values ([(nve defs) (defun #'ve)]) (let-values ([(nve defs) (defun #'ve)])
(values (quasisyntax/loc stx (set! v #,nve)) (values (quasisyntax/loc stx (set! v #,nve))

View File

@ -1,6 +1,7 @@
(module elim-callcc mzscheme (module elim-callcc mzscheme
(require-for-template mzscheme (require-for-template mzscheme
"../lang/abort-resume.ss") "../lang/abort-resume.ss")
(require-for-syntax "../lang/abort-resume.ss")
(require (lib "kerncase.ss" "syntax") (require (lib "kerncase.ss" "syntax")
"util.ss") "util.ss")
(provide elim-callcc) (provide elim-callcc)
@ -42,15 +43,9 @@
(syntax/loc stx (syntax/loc stx
(define-values (v ...) ve)))] (define-values (v ...) ve)))]
[(define-syntaxes (v ...) ve) [(define-syntaxes (v ...) ve)
(parameterize ([transformer? #t]) stx]
(with-syntax ([ve (mark-lambda-as-safe (elim-callcc #'ve))])
(syntax/loc stx
(define-values (v ...) ve))))]
[(define-values-for-syntax (v ...) ve) [(define-values-for-syntax (v ...) ve)
(parameterize ([transformer? #t]) stx]
(with-syntax ([ve (mark-lambda-as-safe (elim-callcc #'ve))])
(syntax/loc stx
(define-values-for-syntax (v ...) ve))))]
[(set! v ve) [(set! v ve)
(with-syntax ([ve (elim-callcc #'ve)]) (with-syntax ([ve (elim-callcc #'ve)])
(syntax/loc stx (set! v ve)))] (syntax/loc stx (set! v ve)))]
@ -158,7 +153,7 @@
[(#%app w rest ...) [(#%app w rest ...)
(markit (markit
(quasisyntax/loc stx (quasisyntax/loc stx
(with-continuation-mark safe-call? '(#f #,stx) (with-continuation-mark safe-call? '(#f stx)
(#%app #,(mark-lambda-as-safe (elim-callcc #'w)) (#%app #,(mark-lambda-as-safe (elim-callcc #'w))
#,@(map #,@(map
(lambda (an-expr) (lambda (an-expr)

View File

@ -1,6 +1,7 @@
(module elim-letrec mzscheme (module elim-letrec mzscheme
(require-for-template mzscheme (require-for-template mzscheme
"../lang/abort-resume.ss") "../lang/abort-resume.ss")
(require-for-syntax "../lang/abort-resume.ss")
(require (lib "kerncase.ss" "syntax") (require (lib "kerncase.ss" "syntax")
(lib "etc.ss") (lib "etc.ss")
(lib "list.ss") (lib "list.ss")
@ -28,15 +29,9 @@
(syntax/loc stx (syntax/loc stx
(define-values (v ...) ve)))] (define-values (v ...) ve)))]
[(define-syntaxes (v ...) ve) [(define-syntaxes (v ...) ve)
(parameterize ([transformer? #t]) stx]
(with-syntax ([ve ((elim-letrec ids) #'ve)])
(syntax/loc stx
(define-syntaxes (v ...) ve))))]
[(define-values-for-syntax (v ...) ve) [(define-values-for-syntax (v ...) ve)
(parameterize ([transformer? #t]) stx]
(with-syntax ([ve ((elim-letrec ids) #'ve)])
(syntax/loc stx
(define-values-for-syntax (v ...) ve))))]
[(set! v ve) [(set! v ve)
(with-syntax ([ve ((elim-letrec ids) #'ve)]) (with-syntax ([ve ((elim-letrec ids) #'ve)])
(if (bound-identifier-member? #'id ids) (if (bound-identifier-member? #'id ids)

View File

@ -103,10 +103,10 @@
stx stx
(syntax-case stx () (syntax-case stx ()
((mb forms ...) ((mb forms ...)
(with-syntax ([(pmb rfs body ...) (with-syntax ([(pmb rfs0 body ...)
(local-expand (quasisyntax/loc stx (local-expand (quasisyntax/loc stx
(#%plain-module-begin (#%plain-module-begin
#,(syntax-local-introduce #'(require-for-syntax mzscheme)) #,(syntax-local-introduce #'(require-for-syntax mzscheme))
forms ...)) forms ...))
'module-begin 'module-begin
empty)]) empty)])
@ -116,7 +116,7 @@
(datum->syntax-object stx (base-labeling)))]) (datum->syntax-object stx (base-labeling)))])
(let ([new-defs (apply append (map transform (syntax->list #'(body ...))))]) (let ([new-defs (apply append (map transform (syntax->list #'(body ...))))])
(quasisyntax/loc stx (quasisyntax/loc stx
(pmb rfs (pmb rfs0
#,@new-defs)))))))))) #,@new-defs))))))))))
(define (bound-identifier-member? id ids) (define (bound-identifier-member? id ids)
@ -147,7 +147,7 @@
(parameterize ([transformer? #t]) (parameterize ([transformer? #t])
(with-syntax ([ve (template #'ve)]) (with-syntax ([ve (template #'ve)])
(syntax/loc stx (syntax/loc stx
(define-values (v ...) ve))))] (define-syntaxes (v ...) ve))))]
[(define-values-for-syntax (v ...) ve) [(define-values-for-syntax (v ...) ve)
(parameterize ([transformer? #t]) (parameterize ([transformer? #t])
(with-syntax ([ve (template #'ve)]) (with-syntax ([ve (template #'ve)])

View File

@ -497,4 +497,34 @@
(let ([k0 (ta-eval '(dispatch-start start 'foo))]) (let ([k0 (ta-eval '(dispatch-start start 'foo))])
(check = 3 (ta-eval `(dispatch ,the-dispatch (list ,k0 2)))) (check = 3 (ta-eval `(dispatch ,the-dispatch (list ,k0 2))))
(check = 0 (ta-eval `(dispatch ,the-dispatch (list ,k0 -1))))))))))) (check = 0 (ta-eval `(dispatch ,the-dispatch (list ,k0 -1))))))))
(test-suite
"Weird Cases"
(test-case
"provide/contract: simple"
(check-not-exn
(lambda ()
(make-module-eval
(module data (lib "lang.ss" "web-server")
(require (lib "contract.ss"))
(define x 1)
(provide/contract
[x integer?]))))))
(test-case
"provide/contract: struct"
(check-not-exn
(lambda ()
(make-module-eval
(module data (lib "lang.ss" "web-server")
(require (lib "contract.ss"))
(define-struct posn (x y))
(provide/contract
[struct posn ([x integer?] [y integer?])])))))))
)))

View File

@ -1,6 +1,7 @@
(module all-lang-tests mzscheme (module all-lang-tests mzscheme
(require (planet "test.ss" ("schematics" "schemeunit.plt" 2)) (require (planet "test.ss" ("schematics" "schemeunit.plt" 2))
"anormal-test.ss" "anormal-test.ss"
"defun-test.ss"
"file-box-test.ss" "file-box-test.ss"
"labels-test.ss" "labels-test.ss"
"stuff-url-test.ss" "stuff-url-test.ss"
@ -11,6 +12,7 @@
(test-suite (test-suite
"Web Language" "Web Language"
anormal-tests anormal-tests
defun-tests
file-box-tests file-box-tests
labels-tests labels-tests
stuff-url-tests stuff-url-tests

View File

@ -332,4 +332,9 @@
(* (car l) (cdr l))]))))) (* (car l) (cdr l))])))))
#t))) #t)))
(test-not-exn "define-struct" (lambda () (normalize-term (expand (syntax (define-struct posn (x y))))))))))) (test-not-exn "define-struct" (lambda () (normalize-term (expand (syntax (define-struct posn (x y)))))))
(test-not-exn "quote-syntax: #f" (lambda () (parameterize ([transformer? #f])
(normalize-term (expand (syntax #'provide/contract-id-set-a-date-day!))))))
(test-not-exn "quote-syntax: #t" (lambda () (parameterize ([transformer? #t])
(normalize-term (expand (syntax #'provide/contract-id-set-a-date-day!))))))
))))

View File

@ -0,0 +1,25 @@
(module defun-test mzscheme
(require (planet "test.ss" ("schematics" "schemeunit.plt" 2))
(lib "defun.ss" "web-server" "lang")
(lib "util.ss" "web-server" "lang"))
(provide defun-tests)
(define-syntax vwrap
(syntax-rules ()
[(_ e)
(call-with-values
(lambda () e)
(lambda x x))]))
(define defun-tests
(test-suite
"Defunctionalization"
(test-not-exn "define-struct" (lambda () (vwrap (defun (expand (syntax (define-struct posn (x y))))))))
(test-not-exn "quote-syntax" (lambda () (vwrap (defun (expand (syntax #'provide/contract-id-set-a-date-day!))))))
#;(test-not-exn "provide/contract" (lambda () (vwrap (defun (expand (syntax (module t mzscheme
(require (lib "contract.ss"))
(define x 1)
(provide/contract
[x integer?]))))))))
)))