Add custom printer for terminal contracts.

original commit: bb74b55f67087848d6eec057e00fd925b0877bc4
This commit is contained in:
Eric Dobson 2014-01-07 22:27:08 -08:00
parent e0a635b8c6
commit 9eaba7098a
2 changed files with 12 additions and 2 deletions

View File

@ -52,4 +52,5 @@
#'(parametric-combinator (list body) vars)]))
(define-terminal-sc parametric-var/sc (id) #:impersonator
#:printer (v p mode) (display (syntax-e (parametric-var/sc-id v)) p)
id)

View File

@ -18,14 +18,23 @@
(define-syntax-class kind-keyword
[pattern #:flat #:with sym 'flat]
[pattern #:chaperone #:with sym 'chaperone]
[pattern #:impersonator #:with sym 'impersonator]))
[pattern #:impersonator #:with sym 'impersonator])
(define-splicing-syntax-class printer
[pattern (~seq #:printer (v p mode) body)
#:with (methods ...) #'(#:methods gen:custom-write [(define (write-proc v p mode) body)])]
[pattern (~seq)
#:with (methods ...) #'()])
)
(define-syntax (define-terminal-sc stx)
(syntax-parse stx
[(_ name:id (args:id ...) kind:kind-keyword body:expr)
[(_ name:id (args:id ...) kind:kind-keyword p:printer body:expr)
#'(struct name static-contract (args ...)
#:transparent
p.methods ...
#:methods gen:sc
[(define (sc-map v f) v)
(define (sc-traverse v f) (void))