Change how contracts for multiple values are handled to be a little cleaner
syntactically. svn: r18458
This commit is contained in:
parent
f2788561d3
commit
5fe0a790c1
|
@ -463,16 +463,14 @@
|
|||
#:fail-when (check-duplicate-identifier (syntax->list #'(var ...)))
|
||||
(format "duplicate exported name ~a"
|
||||
(syntax-e (check-duplicate-identifier (syntax->list #'(var ...)))))])
|
||||
(define-splicing-syntax-class result-clause
|
||||
#:description "a results clause"
|
||||
[pattern (~seq #:result ctc:expr)])
|
||||
(define-splicing-syntax-class rcs
|
||||
(define-splicing-syntax-class results-clause
|
||||
#:attributes ([ctc 1])
|
||||
#:description "a non-empty sequence of result clauses"
|
||||
[pattern (~seq rc:result-clause ...+)
|
||||
#:with (ctc ...) #'(rc.ctc ...)])
|
||||
#:description "a results clause"
|
||||
[pattern (~seq #:result c:expr)
|
||||
#:with (ctc ...) #'(c)]
|
||||
[pattern (~seq #:results (ctc:expr ...))])
|
||||
(syntax-parse stx
|
||||
[(_ (~optional :region-clause #:defaults ([region #'region])) blame:id rc:rcs fv:fvs . body)
|
||||
[(_ (~optional :region-clause #:defaults ([region #'region])) blame:id rc:results-clause fv:fvs . body)
|
||||
(if (not (eq? (syntax-local-context) 'expression))
|
||||
(quasisyntax/loc stx (#%expression #,stx))
|
||||
(let*-values ([(intdef) (syntax-local-make-definition-context)]
|
||||
|
|
|
@ -745,11 +745,12 @@ ensure that the exported functions are treated parametrically.
|
|||
|
||||
@defform*/subs[
|
||||
[(with-contract blame-id (wc-export ...) free-var-list ... body ...+)
|
||||
(with-contract blame-id result-spec ...+ free-var-list ... body ...+)]
|
||||
(with-contract blame-id results-spec free-var-list ... body ...+)]
|
||||
([wc-export
|
||||
(id contract-expr)]
|
||||
[result-spec
|
||||
(code:line #:result contract-expr)]
|
||||
(code:line #:result contract-expr)
|
||||
(code:line #:results (contract-expr ...))]
|
||||
[free-var-list
|
||||
(code:line #:freevars ([id contract-expr] ...))
|
||||
(code:line #:freevar id contract-expr)])]{
|
||||
|
@ -763,9 +764,9 @@ the form allows definition/expression interleaving if its context does.
|
|||
|
||||
The second @scheme[with-contract] form must appear in expression position.
|
||||
The final @scheme[body] expression should return the same number of values
|
||||
as the number of @scheme[result-spec]s, and each returned value is contracted
|
||||
with the contract listed in its respective @scheme[result-spec].
|
||||
The sequence of @scheme[body] forms is treated as for @scheme[let].
|
||||
as the number of contracts listed in the @scheme[result-spec], and each
|
||||
returned value is contracted with its respective contract. The sequence
|
||||
of @scheme[body] forms is treated as for @scheme[let].
|
||||
|
||||
The @scheme[blame-id] is used for the positive positions of
|
||||
contracts paired with exported @scheme[id]s. Contracts broken
|
||||
|
|
|
@ -3045,20 +3045,23 @@
|
|||
(λ (x) 5))
|
||||
#t)
|
||||
"top-level")
|
||||
|
||||
(test/spec-passed
|
||||
'with-contract-exp-values-1
|
||||
'(let-values ([() (with-contract r #:results () (values))])
|
||||
1))
|
||||
|
||||
(test/spec-passed
|
||||
'with-contract-exp-values-1
|
||||
'(let-values ([(x y) (with-contract r
|
||||
#:result number?
|
||||
#:result string?
|
||||
#:results (number? string?)
|
||||
(values 3 "foo"))])
|
||||
1))
|
||||
|
||||
(test/spec-failed
|
||||
'with-contract-exp-values-2
|
||||
'(let-values ([(x y) (with-contract r
|
||||
#:result number?
|
||||
#:result string?
|
||||
#:results (number? string?)
|
||||
(values "bar" "foo"))])
|
||||
1)
|
||||
"(region r)")
|
||||
|
@ -3066,8 +3069,7 @@
|
|||
(test/spec-passed
|
||||
'with-contract-exp-values-3
|
||||
'(let-values ([(x y) (with-contract r
|
||||
#:result number?
|
||||
#:result string?
|
||||
#:results (number? string?)
|
||||
(define (f) (values 3 "foo"))
|
||||
(f))])
|
||||
1))
|
||||
|
|
Loading…
Reference in New Issue
Block a user