Honu: continued implementation of contract helpers.

svn: r1860
This commit is contained in:
Carl Eastlund 2006-01-18 23:30:02 +00:00
parent 07c86de139
commit 830f29891c

View File

@ -46,6 +46,59 @@
#`(begin
(define INSPECTOR-VAR INSPECTOR-EXPR)
#,(build-define-struct #'STRUCT #'INSPECTOR-VAR) ...))]))
(define-syntax (define-structs/provide stx)
(define (build-define-struct struct-stx var-stx)
(syntax-case struct-stx ()
[(NAME (FIELD ...) STRUCT ...)
#`(begin
(define-struct NAME (FIELD ...) #,var-stx)
#,(build-define-struct #'STRUCT var-stx) ...)]))
(define (build-provide struct-stx)
(syntax-case struct-stx ()
[(NAME (FIELD ...) STRUCT ...)
#`(begin
(provide (struct NAME (FIELD ...)))
#,(build-provide #'STRUCT) ...)]))
(syntax-case stx ()
[(_ INSPECTOR-EXPR STRUCT ...)
(with-syntax ([(INSPECTOR-VAR) (generate-temporaries #'(INSPECTOR-EXPR))])
#`(begin
(define INSPECTOR-VAR INSPECTOR-EXPR)
#,(build-define-struct #'STRUCT #'INSPECTOR-VAR) ...
#,(build-provide #'STRUCT) ...))]))
(define-syntax (define-structs/provide/contract stx)
(define (build-define-struct struct-stx var-stx)
(syntax-case struct-stx ()
[(NAME ([FIELD CONTRACT] ...) STRUCT ...)
#`(begin
(define-struct NAME (FIELD ...) #,var-stx)
#,(build-define-struct #'STRUCT var-stx) ...)]))
(define (build-provide/contract struct-stx parent-fields)
(syntax-case struct-stx ()
[(NAME ([FIELD CONTRACT-EXPR] ...) STRUCT ...)
(with-syntax ([(PARENT-FIELD ...) parent-fields]
[(CONTRACT-VAR ...) (generate-temporaries #'(CONTRACT-EXPR ...))]
[FIELDS #'(PARENT-FIELD ... [FIELD CONTRACT-VAR] ...)])
#`(begin
(define CONTRACT-VAR CONTRACT-EXPR) ...
(provide/contract
(struct NAME FIELDS))
#,(build-provide #'STRUCT #'FIELDS) ...))]))
(syntax-case stx ()
[(_ INSPECTOR-EXPR STRUCT ...)
(with-syntax ([(INSPECTOR-VAR) (generate-temporaries #'(INSPECTOR-EXPR))])
#`(begin
(define INSPECTOR-VAR INSPECTOR-EXPR)
#,(build-define-struct #'STRUCT #'INSPECTOR-VAR) ...
#,(build-provide/contract #'STRUCT #'()) ...))]))
(define-syntax (define-structs/provide stx)
(syntax-case stx ()