Fix contracts.
Handle improper formals lists.
This commit is contained in:
parent
e81cdba69f
commit
e7c8ffb834
|
@ -58,7 +58,7 @@
|
||||||
;; listof[id] option[id] block listof[type] option[type] option[(cons type var)] tc-result -> lam-result
|
;; listof[id] option[id] block listof[type] option[type] option[(cons type var)] tc-result -> lam-result
|
||||||
(d/c (check-clause arg-list rest body arg-tys rest-ty drest ret-ty)
|
(d/c (check-clause arg-list rest body arg-tys rest-ty drest ret-ty)
|
||||||
((listof identifier?)
|
((listof identifier?)
|
||||||
(or/c #f identifier?) syntax? (listof Type/c) (or/c #f Type/c) (or/c #f (list/c Type/c symbol?)) tc-results?
|
(or/c #f identifier?) syntax? (listof Type/c) (or/c #f Type/c) (or/c #f (cons/c Type/c symbol?)) tc-results?
|
||||||
. --> .
|
. --> .
|
||||||
lam-result?)
|
lam-result?)
|
||||||
(let* ([arg-len (length arg-list)]
|
(let* ([arg-len (length arg-list)]
|
||||||
|
@ -188,6 +188,16 @@
|
||||||
[(pair? (syntax-e s))
|
[(pair? (syntax-e s))
|
||||||
(+ 1 (loop (cdr (syntax-e s))))]
|
(+ 1 (loop (cdr (syntax-e s))))]
|
||||||
[else 1]))]))
|
[else 1]))]))
|
||||||
|
(define (formals->list s)
|
||||||
|
(let loop ([s s])
|
||||||
|
(cond
|
||||||
|
[(pair? s)
|
||||||
|
(cons (car s) (loop (cdr s)))]
|
||||||
|
[(null? s) s]
|
||||||
|
[(pair? (syntax-e s))
|
||||||
|
(cons (stx-car s) (loop (cdr (syntax-e s))))]
|
||||||
|
[(null? (syntax-e s)) null]
|
||||||
|
[else (list s)])))
|
||||||
(define (go formals bodies formals* bodies* nums-seen)
|
(define (go formals bodies formals* bodies* nums-seen)
|
||||||
(cond
|
(cond
|
||||||
[(null? formals)
|
[(null? formals)
|
||||||
|
@ -212,7 +222,7 @@
|
||||||
(let ([fmls (car (syntax->list formals))])
|
(let ([fmls (car (syntax->list formals))])
|
||||||
(for/list ([args argss] [ret rets] [rest rests] [drest drests])
|
(for/list ([args argss] [ret rets] [rest rests] [drest drests])
|
||||||
(tc/lambda-clause/check fmls (car (syntax->list bodies))
|
(tc/lambda-clause/check fmls (car (syntax->list bodies))
|
||||||
args (values->tc-results ret (syntax->list fmls)) rest drest)))]
|
args (values->tc-results ret (formals->list fmls)) rest drest)))]
|
||||||
[_ (go (syntax->list formals) (syntax->list bodies) null null null)]))]
|
[_ (go (syntax->list formals) (syntax->list bodies) null null null)]))]
|
||||||
;; otherwise
|
;; otherwise
|
||||||
[else (go (syntax->list formals) (syntax->list bodies) null null null)]))
|
[else (go (syntax->list formals) (syntax->list bodies) null null null)]))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user