Make let: annotations optional.

original commit: 4137eb9e73d7e4b6d1aa2fe5cff52e81c9ba10da
This commit is contained in:
Vincent St-Amour 2012-12-31 17:26:44 -05:00
parent 78ee359d5a
commit 91f639247e
2 changed files with 31 additions and 6 deletions

View File

@ -0,0 +1,9 @@
#lang typed/racket/base
(: f : Integer -> (Listof Any))
(define (f x)
(let: loop ([i : Integer 0] [l '()])
(if (> i x)
l
(loop (add1 i) (cons i l)))))
(f 10)

View File

@ -416,13 +416,29 @@ This file defines two sorts of primitives. All of them are provided into any mod
(define-syntax (let: stx)
(syntax-parse stx #:literals (:)
[(let: nm:id ~! : ret-ty (bs:annotated-binding ...) . body)
[(let: nm:id ~! ; named let:
(~and (~seq rest ...)
(~seq (~optional (~seq : ret-ty))
(bs:optionally-annotated-binding ...) body ...)))
(quasisyntax/loc stx
(#,(quasisyntax/loc stx
(letrec: ([nm : (bs.ty ... -> ret-ty)
#,(quasisyntax/loc stx
(lambda (bs.ann-name ...) . #,(syntax/loc stx body)))])
#,(quasisyntax/loc stx nm)))
(#,(syntax-parse #'(rest ...)
#:literals (:)
[(: ret-ty (bs:annotated-binding ...) . body)
(quasisyntax/loc stx
(letrec: ([nm : (bs.ty ... -> ret-ty)
#,(quasisyntax/loc stx
(lambda (bs.ann-name ...) . #,(syntax/loc stx body)))])
#,(quasisyntax/loc stx nm)))]
[(: ret-ty (bs:optionally-annotated-binding ...) . body)
(quasisyntax/loc stx
(letrec ([nm #,(quasisyntax/loc stx
(lambda (bs.ann-name ...) . (ann #,(syntax/loc stx body) ret-ty)))])
#,(quasisyntax/loc stx nm)))]
[((bs:optionally-annotated-binding ...) . body)
(quasisyntax/loc stx
(letrec ([nm #,(quasisyntax/loc stx
(lambda (bs.ann-name ...) . #,(syntax/loc stx body)))])
#,(quasisyntax/loc stx nm)))])
bs.rhs ...))]
[(let: . rest)
(syntax/loc stx (let-internal: . rest))]))