original commit: 024a1a90247703e7eb35512274fd31c0cae673ff
This commit is contained in:
Robby Findler 2002-06-10 20:39:55 +00:00
parent 47f6449f71
commit e519a29adc

View File

@ -7,6 +7,7 @@
->d* ->d*
case-> case->
opt-> opt->
opt->*
(rename -contract? contract?) (rename -contract? contract?)
provide/contract) provide/contract)
@ -575,30 +576,36 @@
(define-syntax (opt-> stx) (define-syntax (opt-> stx)
(syntax-case stx () (syntax-case stx ()
[(_ (reqs ...) (opts ...) res) [(_ (reqs ...) (opts ...) res)
(let* ([res-v (generate-temporaries (list (syntax res)))] (syntax (opt->* (reqs ...) (opts ...) (res)))]))
(define-syntax (opt->* stx)
(syntax-case stx ()
[(_ (reqs ...) (opts ...) (ress ...))
(let* ([res-vs (generate-temporaries (syntax->list (syntax (ress ...))))]
[req-vs (generate-temporaries (syntax->list (syntax (reqs ...))))] [req-vs (generate-temporaries (syntax->list (syntax (reqs ...))))]
[opt-vs (generate-temporaries (syntax->list (syntax (opts ...))))] [opt-vs (generate-temporaries (syntax->list (syntax (opts ...))))]
[cases [cases
(reverse (reverse
(let loop ([opt-vs (reverse opt-vs)]) (let loop ([opt-vs (reverse opt-vs)])
(cond (cond
[(null? opt-vs) (list (append req-vs res-v))] [(null? opt-vs) (list req-vs)]
[else (cons (append req-vs (reverse opt-vs) res-v) [else (cons (append req-vs (reverse opt-vs))
(loop (cdr opt-vs)))])))]) (loop (cdr opt-vs)))])))])
(with-syntax ([(res-v) res-v] (with-syntax ([((double-res-vs ...) ...) (map (lambda (x) res-vs) cases)]
[(req-vs ...) req-vs] [(res-vs ...) res-vs]
[(req-vs ...) req-vs]
[(opt-vs ...) opt-vs] [(opt-vs ...) opt-vs]
[((cases ...) ...) cases]) [((case-doms ...) ...) cases])
(syntax (syntax
(let ([res-v res] (let ([res-vs ress] ...
[req-vs reqs] ... [req-vs reqs] ...
[opt-vs opts] ...) [opt-vs opts] ...)
(case-> (-> cases ...) ...)))))])) (case-> (->* (case-doms ...) (double-res-vs ...)) ...)))))]))
(define -contract? (define -contract?
(let ([contract? (let ([contract?
(lambda (val) (lambda (val)
(or (contract? val) ;; refers to struct (or (contract? val) ;; refers to struct predicate
(and (procedure? val) (and (procedure? val)
(procedure-arity-includes? val 1))))]) (procedure-arity-includes? val 1))))])
contract?)) contract?))