From f992786243ac5b1bb4500a0fa6baeeacd91d43c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Thu, 17 Dec 2015 14:00:58 +0100 Subject: [PATCH] =?UTF-8?q?Fixes=20GH=20issue=20#268=20=E2=80=9CCan't=20pr?= =?UTF-8?q?ovide=20promise=20for=20polymorphic=20struct=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See also commit 5cd5f77 “Don't allow promises created with `delay/name` as `(Promise T)`.”. The contracts in `typed-racket-lib/typed-racket/static-contracts/combinators/structural.rkt` should be just a single identifier, not a lambda expression, because `typed-racket-lib/typed-racket/private/type-contract.rkt` relies on that, and passes the contract name to free-identifier=?, which won't work on a lambda. --- typed-racket-lib/typed-racket/private/type-contract.rkt | 1 + .../static-contracts/combinators/structural.rkt | 5 +++-- .../typed-racket/utils/promise-not-name-contract.rkt | 6 ++++++ .../succeed/promise-provide-generate-contract.rkt | 5 +++++ 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 typed-racket-lib/typed-racket/utils/promise-not-name-contract.rkt create mode 100644 typed-racket-test/succeed/promise-provide-generate-contract.rkt diff --git a/typed-racket-lib/typed-racket/private/type-contract.rkt b/typed-racket-lib/typed-racket/private/type-contract.rkt index d2f6ec47..a8b662de 100644 --- a/typed-racket-lib/typed-racket/private/type-contract.rkt +++ b/typed-racket-lib/typed-racket/private/type-contract.rkt @@ -166,6 +166,7 @@ typed-racket/utils/opaque-object typed-racket/utils/evt-contract typed-racket/utils/sealing-contract + typed-racket/utils/promise-not-name-contract racket/sequence racket/contract/parametric)) diff --git a/typed-racket-lib/typed-racket/static-contracts/combinators/structural.rkt b/typed-racket-lib/typed-racket/static-contracts/combinators/structural.rkt index a10f7817..88c23e4b 100644 --- a/typed-racket-lib/typed-racket/static-contracts/combinators/structural.rkt +++ b/typed-racket-lib/typed-racket/static-contracts/combinators/structural.rkt @@ -15,7 +15,8 @@ racket/async-channel racket/sequence racket/promise - "../../utils/evt-contract.rkt") + "../../utils/evt-contract.rkt" + "../../utils/promise-not-name-contract.rkt") racket/contract racket/async-channel) @@ -153,7 +154,7 @@ ((set/sc (#:covariant #:chaperone)) set/c #:flat) ((vector/sc . (#:invariant)) vector/c #:chaperone) ((vectorof/sc (#:invariant)) vectorof #:chaperone) - ((promise/sc (#:covariant)) (λ (x) (and/c (promise/c x) (not/c promise/name?))) #:chaperone) + ((promise/sc (#:covariant)) promise-not-name/c #:chaperone) ((syntax/sc (#:covariant #:flat)) syntax/c #:flat) ((hash/sc (#:invariant #:flat) (#:invariant)) hash/c #:chaperone) ((box/sc (#:invariant)) box/c #:chaperone) diff --git a/typed-racket-lib/typed-racket/utils/promise-not-name-contract.rkt b/typed-racket-lib/typed-racket/utils/promise-not-name-contract.rkt new file mode 100644 index 00000000..25a0e334 --- /dev/null +++ b/typed-racket-lib/typed-racket/utils/promise-not-name-contract.rkt @@ -0,0 +1,6 @@ +#lang racket/base + +(require racket/contract + racket/promise) +(provide promise-not-name/c) +(define (promise-not-name/c x) (and/c (promise/c x) (not/c promise/name?))) diff --git a/typed-racket-test/succeed/promise-provide-generate-contract.rkt b/typed-racket-test/succeed/promise-provide-generate-contract.rkt new file mode 100644 index 00000000..a4b69d7a --- /dev/null +++ b/typed-racket-test/succeed/promise-provide-generate-contract.rkt @@ -0,0 +1,5 @@ +#lang typed/racket + +(struct (A) s ([f : Any])) +(define p (delay (s "a"))) +(provide p)