allow promises to be impersonated and thus allow impersonator contracts

related to PR 12861
This commit is contained in:
Robby Findler 2012-07-10 22:21:09 -05:00
parent 3028099eae
commit dcdc2aea02
3 changed files with 20 additions and 15 deletions

View File

@ -827,6 +827,8 @@
(let* ([ctc (coerce-contract 'promise/c ctc-in)]
[ctc-proc (contract-projection ctc)])
(define chap? (chaperone-contract? ctc))
(define c/i-struct (if chap? chaperone-struct impersonate-struct))
(define c/i-procedure (if chap? chaperone-procedure impersonate-procedure))
((if chap? make-chaperone-contract make-contract)
#:name (build-compound-type-name 'promise/c ctc)
#:projection
@ -839,15 +841,13 @@
val
'(expected "<promise>," given: "~e")
val))
(if chap?
(chaperone-struct
val
promise-forcer (λ (_ proc)
(chaperone-procedure
proc
(λ (promise)
(values p-app promise)))))
(delay (p-app (force val)))))))
(c/i-struct
val
promise-forcer (λ (_ proc)
(c/i-procedure
proc
(λ (promise)
(values p-app promise))))))))
#:first-order promise?))))
(define/subexpression-pos-prop (parameter/c x)

View File

@ -147,12 +147,7 @@
;; property value for the right forcer to use
(define-values [prop:force promise-forcer]
(let-values ([(prop pred? get) ; no need for the predicate
(make-struct-type-property 'forcer
(lambda (v info)
(unless (and (procedure? v)
(procedure-arity-includes? v 1))
(raise-argument-error 'prop:force "(any/c . -> . any)" v))
v))])
(make-struct-type-property 'forcer 'can-impersonate)])
(values prop get)))
;; A promise value can hold

View File

@ -9255,6 +9255,16 @@
'pos
'neg)))
#t)
(test/spec-passed/result
'promise/c6
'(let ([a (delay 7)])
(equal? a
(contract (promise/c (new-∃/c 'α))
a
'pos
'neg)))
#t)
;