racket/pkgs/racket-test/tests/units/test-exptime.rkt
Matthew Flatt 86ee9c5071 signature-members: adjust element ids based on reference
Make the resulting content ids compatible with binding and reference
at a use site, as needed for the new macro expander.
2015-08-13 10:44:26 -06:00

92 lines
3.0 KiB
Racket

#lang racket/load
(require (for-syntax racket/unit-exptime))
(require "test-harness.rkt"
racket/unit)
(define-signature one^ (one-a one-b))
(define-signature two^ (two-a
(define-values (two-v1 two-v2) (values 1 2))
(define-syntaxes (m) (syntax-rules () [(_) two-v2]))))
(define-signature three^ ())
(define-signature four^ extends two^ (four-z))
(define-unit one@
(import one^ three^)
(export two^)
(init-depend one^)
(define two-a 10))
(define-unit two@
(import (tag Four four^))
(export (tag One one^))
(init-depend (tag Four four^))
(define one-a 10)
(define one-b 20))
(define-syntax (unit-info stx)
(syntax-case stx ()
[(_ id k) (let-values ([(ins out)
(unit-static-signatures #'id stx)])
#`(k (#,ins #,out)))]))
(define-syntax (sig-info stx)
(syntax-case stx ()
[(_ id k) (let-values ([(super vars def-vars def-macs)
(signature-members #'id stx)])
#`(k (#,super #,vars #,def-vars #,def-macs)))]))
(define-syntax (unit-dep-info stx)
(syntax-case stx ()
[(_ id k) (let ([deps (unit-static-init-dependencies #'id stx)])
#`(k #,deps))]))
(test '(#f (one-a one-b) () ()) (sig-info one^ quote))
(test '(#f (two-a) (two-v1 two-v2) (m)) (sig-info two^ quote))
(test '(#f () () ()) (sig-info three^ quote))
(test '(two^ (two-a four-z) (two-v1 two-v2) (two-a two-v1 two-v2 m m)) (sig-info four^ quote))
(test '(((#f . one^) (#f . three^)) ((#f . two^))) (unit-info one@ quote))
(test '(((Four . four^)) ((One . one^))) (unit-info two@ quote))
(test '((#f . one^)) (unit-dep-info one@ quote))
(test '((Four . four^)) (unit-dep-info two@ quote))
(module m racket/base
(require racket/unit
(for-syntax racket/base))
(provide x^ y^)
(define-signature x^ (x))
(define-signature y^ (y
(define-syntaxes (get-y) (lambda (stx) #'y))
(define-values (y2) 10))))
(require 'm)
;; based on code by Jay:
(define-syntax (as-s stx)
(syntax-case stx ()
[(_ e ...)
(with-syntax ([([i-export e-export] ...)
(let-values ([(_1 ids _2 _3) (signature-members #'x^ stx)])
(for/list ([i (in-list ids)])
(list i (datum->syntax stx (syntax->datum i)))))]
[([i-import e-import] ...)
(let-values ([(_1 ids var-ids stx-ids) (signature-members #'y^ stx)])
(for/list ([i (in-list (append ids var-ids stx-ids))])
(list i (datum->syntax stx (syntax->datum i)))))])
(syntax/loc stx
(unit (import y^) (export x^)
(define-syntax e-import (make-rename-transformer #'i-import))
...
e ...
(define i-export e-export)
...)))]))
(define y 'y)
(define-values/invoke-unit
(as-s (define x (list y (get-y) y2)))
(import y^)
(export x^))
(test '(y y 10) x)
(displayln "tests passed")