Implement dmap operations.
Remove lots of unneeded requires. Add in-list-forever and extend to utils.ss Add optional variable argument to c-meet.
This commit is contained in:
parent
49be490b51
commit
e2c0b4e642
|
@ -1,30 +1,15 @@
|
|||
#lang scheme/unit
|
||||
|
||||
(require syntax/kerncase
|
||||
syntax/struct
|
||||
syntax/stx
|
||||
scheme/match
|
||||
"type-contract.ss"
|
||||
"signatures.ss"
|
||||
"tc-structs.ss"
|
||||
"type-utils.ss"
|
||||
"utils.ss" ;; doesn't need tests
|
||||
"type-rep.ss" ;; doesn't need tests
|
||||
"type-effect-convenience.ss" ;; maybe needs tests
|
||||
"union.ss"
|
||||
"subtype.ss" ;; has tests
|
||||
"internal-forms.ss" ;; doesn't need tests
|
||||
"planet-requires.ss" ;; doesn't need tests
|
||||
"type-env.ss" ;; maybe needs tests
|
||||
"parse-type.ss" ;; has tests
|
||||
"tc-utils.ss" ;; doesn't need tests
|
||||
"type-environments.ss" ;; doesn't need tests
|
||||
"lexical-env.ss" ;; maybe needs tests
|
||||
"type-annotation.ss" ;; has tests
|
||||
"type-name-env.ss" ;; maybe needs tests
|
||||
"init-envs.ss"
|
||||
"effect-rep.ss"
|
||||
"mutated-vars.ss")
|
||||
)
|
||||
|
||||
(import tc-if^ tc-lambda^ tc-app^ tc-let^ tc-expr^)
|
||||
(export check-subforms^)
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
#lang scheme/unit
|
||||
|
||||
(require "type-effect-convenience.ss" "type-rep.ss" "effect-rep.ss" "rep-utils.ss"
|
||||
"free-variance.ss" "type-utils.ss" "union.ss" "tc-utils.ss" "type-name-env.ss"
|
||||
"subtype.ss" "remove-intersect.ss" "utils.ss"
|
||||
(require "type-effect-convenience.ss" "type-rep.ss"
|
||||
"type-utils.ss" "union.ss" "tc-utils.ss"
|
||||
"subtype.ss" "utils.ss"
|
||||
"signatures.ss"
|
||||
scheme/match
|
||||
mzlib/etc
|
||||
mzlib/trace
|
||||
scheme/list)
|
||||
scheme/match)
|
||||
|
||||
(import restrict^)
|
||||
(import restrict^ dmap^)
|
||||
(export constraints^)
|
||||
|
||||
|
||||
|
@ -68,13 +65,15 @@
|
|||
(define (join T U) (Un T U))
|
||||
|
||||
|
||||
(define c-meet
|
||||
(match-lambda**
|
||||
[((struct c (S X T)) (struct c (S* _ T*)))
|
||||
(let ([S (join S S*)] [T (meet T T*)])
|
||||
(unless (subtype S T)
|
||||
(fail! S T))
|
||||
(make-c S X T))]))
|
||||
(define (c-meet c1 c2 [var #f])
|
||||
(match* (c1 c2)
|
||||
[((struct c (S X T)) (struct c (S* X* T*)))
|
||||
(unless (or var (eq? X X*))
|
||||
(int-err "Non-matching vars in c-meet: ~a ~a" X X*))
|
||||
(let ([S (join S S*)] [T (meet T T*)])
|
||||
(unless (subtype S T)
|
||||
(fail! S T))
|
||||
(make-c S (or var X) T))]))
|
||||
|
||||
(define (subst-all/c sub -c)
|
||||
(match -c
|
||||
|
|
|
@ -1,6 +1,50 @@
|
|||
#lang scheme/unit
|
||||
|
||||
(import)
|
||||
(export)
|
||||
(require "signatures.ss" "utils.ss" "tc-utils.ss" scheme/match)
|
||||
|
||||
(import constraints^)
|
||||
(export dmap^)
|
||||
|
||||
;; map : hash mapping variable to dcon
|
||||
(define-struct dmap (map))
|
||||
|
||||
;; fixed : Listof[c]
|
||||
;; rest : option[c]
|
||||
(define-struct dcon (fixed rest))
|
||||
|
||||
;; dcon-meet : dcon dcon -> dcon
|
||||
(define (dcon-meet dc1 dc2)
|
||||
(match* (dc1 dc2)
|
||||
[((struct dcon (fixed1 #f)) (struct dcon (fixed2 #f)))
|
||||
(unless (= (length fixed1) (length fixed2))
|
||||
(fail! fixed1 fixed2))
|
||||
(make-dcon
|
||||
(for/list ([c1 fixed1]
|
||||
[c2 fixed2])
|
||||
(c-meet c1 c2 (c-X c1)))
|
||||
#f)]
|
||||
[((struct dcon (fixed1 #f)) (struct dcon (fixed2 rest)))
|
||||
(unless (>= (length fixed1) (length fixed2))
|
||||
(fail! fixed1 fixed2))
|
||||
(make-dcon
|
||||
(for/list ([c1 fixed1]
|
||||
[c2 (in-list-forever fixed2 rest)])
|
||||
(c-meet c1 c2 (c-X c1)))
|
||||
#f)]
|
||||
[((struct dcon (fixed1 rest)) (struct dcon (fixed2 #f)))
|
||||
(dcon-meet dc2 dc1)]
|
||||
[((struct dcon (fixed1 rest1)) (struct dcon (fixed2 rest2)))
|
||||
(let-values ([(shorter longer srest lrest)
|
||||
(if (< (length fixed1) (length fixed2))
|
||||
(values fixed1 fixed2 rest1 rest2)
|
||||
(values fixed2 fixed1 rest2 rest1))])
|
||||
(make-dcon
|
||||
(for/list ([c1 longer]
|
||||
[c2 (in-list-forever shorter srest)])
|
||||
(c-meet c1 c2 (c-X c1)))
|
||||
(c-meet lrest srest (c-X lrest))))]))
|
||||
|
||||
(define (dmap-meet dm1 dm2)
|
||||
(hash-union dm1 dm2
|
||||
(lambda (k dc1 dc2) (dcon-meet dc1 dc2))))
|
||||
|
||||
|
|
|
@ -11,8 +11,6 @@
|
|||
(import constraints^ promote-demote^)
|
||||
(export infer^)
|
||||
|
||||
|
||||
|
||||
(define (empty-set) '())
|
||||
|
||||
(define current-seen (make-parameter (empty-set)))
|
||||
|
@ -25,7 +23,6 @@
|
|||
(make-cset (for/list ([(cs vs) (in-pairs (cset-maps cset))])
|
||||
(cons cs (hash-set vs dbound vars)))))
|
||||
|
||||
|
||||
;; ss and ts have the same length
|
||||
(define (cgen-union V X ss ts)
|
||||
;; first, we remove common elements of ss and ts
|
||||
|
@ -279,24 +276,8 @@
|
|||
(subst-gen cs R)
|
||||
(cset-meet cs (cgen null X R expected))))))
|
||||
|
||||
;; Listof[A] Listof[B] B -> Listof[B]
|
||||
;; pads out t to be as long as s
|
||||
(define (extend s t extra)
|
||||
(append t (build-list (- (length s) (length t)) (lambda _ extra))))
|
||||
|
||||
(define (infer/simple S T R)
|
||||
(infer (fv/list T) S T R))
|
||||
|
||||
|
||||
(define (i s t r)
|
||||
(infer/simple (list s) (list t) r))
|
||||
|
||||
;; this is *definitely* not yet correct
|
||||
|
||||
|
||||
;(trace infer cgen cset-meet* subst-gen)
|
||||
;(trace cgen/arr cgen/list cset-meet)
|
||||
|
||||
;(trace infer/dots cset-meet)
|
||||
|
||||
;(trace infer subst-gen cgen)
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
#lang scheme/unit
|
||||
|
||||
(require "type-effect-convenience.ss" "type-rep.ss" "effect-rep.ss" "rep-utils.ss"
|
||||
"free-variance.ss" "type-utils.ss" "union.ss" "tc-utils.ss" "type-name-env.ss"
|
||||
"subtype.ss" "remove-intersect.ss" "signatures.ss" "utils.ss"
|
||||
scheme/match
|
||||
mzlib/etc
|
||||
mzlib/trace
|
||||
(require "type-effect-convenience.ss" "type-rep.ss"
|
||||
"type-utils.ss" "union.ss"
|
||||
"signatures.ss"
|
||||
scheme/list)
|
||||
|
||||
(import)
|
||||
|
|
|
@ -1,28 +1,11 @@
|
|||
#lang scheme/base
|
||||
|
||||
(require (only-in srfi/1/list s:member)
|
||||
syntax/kerncase syntax/struct syntax/stx
|
||||
syntax/kerncase
|
||||
mzlib/trace
|
||||
"type-contract.ss"
|
||||
"signatures.ss"
|
||||
"tc-structs.ss"
|
||||
"utils.ss" ;; doesn't need tests
|
||||
"type-rep.ss" ;; doesn't need tests
|
||||
"type-effect-convenience.ss" ;; maybe needs tests
|
||||
"union.ss"
|
||||
"subtype.ss" ;; has tests
|
||||
"internal-forms.ss" ;; doesn't need tests
|
||||
"planet-requires.ss" ;; doesn't need tests
|
||||
"type-env.ss" ;; maybe needs tests
|
||||
"parse-type.ss" ;; has tests
|
||||
"tc-utils.ss" ;; doesn't need tests
|
||||
"type-environments.ss" ;; doesn't need tests
|
||||
"lexical-env.ss" ;; maybe needs tests
|
||||
"type-annotation.ss" ;; has tests
|
||||
"type-name-env.ss" ;; maybe needs tests
|
||||
"init-envs.ss"
|
||||
"effect-rep.ss"
|
||||
"mutated-vars.ss"
|
||||
"type-rep.ss"
|
||||
"tc-utils.ss"
|
||||
"def-binding.ss")
|
||||
|
||||
(require (for-template scheme/base
|
||||
|
|
|
@ -2,6 +2,11 @@
|
|||
(require scheme/unit)
|
||||
(provide (all-defined-out))
|
||||
|
||||
(define-signature dmap^
|
||||
((struct dmap (map))
|
||||
(struct dcon (fixed rest))
|
||||
dmap-meet))
|
||||
|
||||
(define-signature promote-demote^
|
||||
(var-promote var-demote))
|
||||
|
||||
|
@ -18,6 +23,7 @@
|
|||
empty-cset
|
||||
insert
|
||||
cset-combine
|
||||
c-meet
|
||||
(struct c (S X T))))
|
||||
|
||||
(define-signature restrict^
|
||||
|
|
|
@ -2,30 +2,19 @@
|
|||
|
||||
|
||||
(require syntax/kerncase
|
||||
syntax/struct
|
||||
syntax/stx
|
||||
scheme/match
|
||||
"type-contract.ss"
|
||||
"signatures.ss"
|
||||
"tc-structs.ss"
|
||||
"type-utils.ss"
|
||||
"utils.ss" ;; doesn't need tests
|
||||
"type-rep.ss" ;; doesn't need tests
|
||||
"type-effect-convenience.ss" ;; maybe needs tests
|
||||
"union.ss"
|
||||
"subtype.ss" ;; has tests
|
||||
"internal-forms.ss" ;; doesn't need tests
|
||||
"planet-requires.ss" ;; doesn't need tests
|
||||
"type-env.ss" ;; maybe needs tests
|
||||
"parse-type.ss" ;; has tests
|
||||
"tc-utils.ss" ;; doesn't need tests
|
||||
"type-environments.ss" ;; doesn't need tests
|
||||
"lexical-env.ss" ;; maybe needs tests
|
||||
"type-annotation.ss" ;; has tests
|
||||
"type-name-env.ss" ;; maybe needs tests
|
||||
"init-envs.ss"
|
||||
"effect-rep.ss"
|
||||
"mutated-vars.ss"
|
||||
scheme/private/class-internal)
|
||||
|
||||
(require (for-template scheme/base scheme/private/class-internal))
|
||||
|
|
|
@ -1,18 +1,17 @@
|
|||
#lang scheme/unit
|
||||
|
||||
(require "signatures.ss"
|
||||
(lib "trace.ss")
|
||||
mzlib/trace
|
||||
(except-in "type-rep.ss" make-arr) ;; doesn't need tests
|
||||
"type-effect-convenience.ss" ;; maybe needs tests
|
||||
"type-environments.ss" ;; doesn't need tests
|
||||
"lexical-env.ss" ;; maybe needs tests
|
||||
"type-annotation.ss" ;; has tests
|
||||
"utils.ss"
|
||||
(except-in "utils.ss" extend)
|
||||
"type-utils.ss"
|
||||
"effect-rep.ss"
|
||||
"tc-utils.ss"
|
||||
"union.ss"
|
||||
"resolve-type.ss"
|
||||
(lib "plt-match.ss")
|
||||
(only-in "type-effect-convenience.ss" [make-arr* make-arr]))
|
||||
(require (for-template scheme/base "internal-forms.ss"))
|
||||
|
|
|
@ -12,7 +12,9 @@
|
|||
id
|
||||
filter-multiple
|
||||
hash-union
|
||||
in-pairs)
|
||||
in-pairs
|
||||
in-list-forever
|
||||
extend)
|
||||
|
||||
(define-syntax (with-syntax* stx)
|
||||
(syntax-case stx ()
|
||||
|
@ -141,4 +143,20 @@
|
|||
#t
|
||||
(lambda (_) (more?))
|
||||
(lambda _ #t)
|
||||
(lambda _ #t))))))
|
||||
(lambda _ #t))))))
|
||||
|
||||
(define (in-list-forever seq val)
|
||||
(make-do-sequence
|
||||
(lambda ()
|
||||
(let-values ([(more? gen) (sequence-generate seq)])
|
||||
(values (lambda (e) (let ([e (if (more?) (gen) val)]) e))
|
||||
(lambda (_) #t)
|
||||
#t
|
||||
(lambda (_) #t)
|
||||
(lambda _ #t)
|
||||
(lambda _ #t))))))
|
||||
|
||||
;; Listof[A] Listof[B] B -> Listof[B]
|
||||
;; pads out t to be as long as s
|
||||
(define (extend s t extra)
|
||||
(append t (build-list (- (length s) (length t)) (lambda _ extra))))
|
|
@ -12,7 +12,7 @@
|
|||
"private/tc-utils.ss"
|
||||
"private/type-name-env.ss"
|
||||
"private/type-alias-env.ss"
|
||||
"private/utils.ss"
|
||||
(except-in "private/utils.ss" extend)
|
||||
(only-in "private/infer-dummy.ss" infer-param)
|
||||
"private/infer.ss"
|
||||
"private/type-effect-convenience.ss"
|
||||
|
|
Loading…
Reference in New Issue
Block a user