add
This commit is contained in:
parent
223c822154
commit
cf33d49c26
35
collects/typed-scheme/private/tc-dots-unit.ss
Normal file
35
collects/typed-scheme/private/tc-dots-unit.ss
Normal file
|
@ -0,0 +1,35 @@
|
|||
#lang scheme/unit
|
||||
|
||||
(require "signatures.ss"
|
||||
"tc-utils.ss"
|
||||
"type-environments.ss"
|
||||
"type-utils.ss"
|
||||
"type-rep.ss"
|
||||
syntax/kerncase
|
||||
scheme/match)
|
||||
|
||||
(require (for-template scheme/base))
|
||||
|
||||
(import tc-expr^ tc-app^)
|
||||
(export tc-dots^)
|
||||
|
||||
;; form : syntax[expr]
|
||||
;; returns two values : one is the type, the other the bound on the ... (always a symbol)
|
||||
(define (tc/dots form)
|
||||
(parameterize ([current-orig-stx form])
|
||||
(kernel-syntax-case* form #f (map)
|
||||
[id
|
||||
(identifier? #'id)
|
||||
(match (lookup (dotted-env) #'id (lambda (k) (lookup-fail (syntax-e k))))
|
||||
[(cons dty dbound)
|
||||
(values dty dbound)])]
|
||||
[(#%plain-app map f l)
|
||||
(let-values ([(lty lbound) (tc/dots #'l)])
|
||||
(parameterize ([current-tvars (extend-env (list lbound)
|
||||
(list (make-DottedBoth (make-F lbound)))
|
||||
(current-tvars))])
|
||||
(match-let* ([ft (tc-expr #'f)]
|
||||
[(tc-result: t) (tc/funapp #'f #'(l) ft (list (ret lty)) #f)])
|
||||
(values t lbound))))]
|
||||
[_
|
||||
(tc-error "form cannot be used where a term of ... type is expected")])))
|
Loading…
Reference in New Issue
Block a user