From 4137eb9e73d7e4b6d1aa2fe5cff52e81c9ba10da Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Mon, 31 Dec 2012 17:26:44 -0500 Subject: [PATCH] Make let: annotations optional. --- .../succeed/let:-partial-annotations.rkt | 9 ++++++ collects/typed-racket/base-env/prims.rkt | 28 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 collects/tests/typed-racket/succeed/let:-partial-annotations.rkt diff --git a/collects/tests/typed-racket/succeed/let:-partial-annotations.rkt b/collects/tests/typed-racket/succeed/let:-partial-annotations.rkt new file mode 100644 index 0000000000..8b402854ff --- /dev/null +++ b/collects/tests/typed-racket/succeed/let:-partial-annotations.rkt @@ -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) diff --git a/collects/typed-racket/base-env/prims.rkt b/collects/typed-racket/base-env/prims.rkt index 57c0a767e2..3a61b1f571 100644 --- a/collects/typed-racket/base-env/prims.rkt +++ b/collects/typed-racket/base-env/prims.rkt @@ -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))]))