Make let: annotations optional.
original commit: 4137eb9e73d7e4b6d1aa2fe5cff52e81c9ba10da
This commit is contained in:
parent
78ee359d5a
commit
91f639247e
|
@ -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)
|
|
@ -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))]))
|
||||
|
|
Loading…
Reference in New Issue
Block a user