fix resolve for names being defined

This commit is contained in:
Andrew Kent 2016-10-23 21:47:00 -04:00
parent 4bfebbda98
commit 9df3a1dab5
2 changed files with 15 additions and 5 deletions

View File

@ -10,10 +10,12 @@
racket/format)
(provide resolve-name resolve-app resolvable?
resolve resolve-app-check-error
resolve-app-check-error
resolver-cache-remove!
current-check-polymorphic-recursion)
(provide/cond-contract [resolve-once (Type? . -> . (or/c Type? #f))])
(provide/cond-contract
[resolve-once (Type? . -> . (or/c Type? #f))]
[resolve (Type? . -> . Type?)])
(define-struct poly (name vars) #:prefab)
@ -136,6 +138,8 @@
(define resolver-cache (make-hash))
;; unfolds a Mu, App, or Name, but returns #f if it
;; is a Name which has not yet been defined
(define (resolve-once t)
(define r (hash-ref resolver-cache t #f))
(or r
@ -159,6 +163,8 @@
;; constructor is not one of them.
;; Type? -> Type?
(define (resolve t)
(if (resolvable? t)
(resolve (resolve-once t))
t))
(cond
[(resolvable? t)
(define t* (resolve-once t))
(if t* (resolve t*) t)]
[else t]))

View File

@ -0,0 +1,4 @@
#lang typed/racket/base
;; https://github.com/racket/typed-racket/issues/447
(struct St ())
(define-type A ( (B) ( ( B St) Number)))