From 1e256742877a8028240350e1c3b4bcd082bbdf6f Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Wed, 19 May 2010 11:38:01 -0500 Subject: [PATCH] Allow recursive types in type annotations for `list'. Closes PR 10562. Tests for fixed bugs. original commit: 7e9313bad3c8f8b7d6e0241f6904dce45ac77786 --- collects/tests/typed-scheme/fail/pr10350.rkt | 12 ++++++++++++ collects/tests/typed-scheme/succeed/pr10319.rkt | 14 ++++++++++++++ collects/tests/typed-scheme/succeed/pr10342.rkt | 5 +++++ collects/tests/typed-scheme/succeed/pr10562.rkt | 4 ++++ collects/typed-scheme/types/abbrev.rkt | 4 ++-- 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 collects/tests/typed-scheme/fail/pr10350.rkt create mode 100644 collects/tests/typed-scheme/succeed/pr10319.rkt create mode 100644 collects/tests/typed-scheme/succeed/pr10342.rkt create mode 100644 collects/tests/typed-scheme/succeed/pr10562.rkt diff --git a/collects/tests/typed-scheme/fail/pr10350.rkt b/collects/tests/typed-scheme/fail/pr10350.rkt new file mode 100644 index 00000000..a3c78126 --- /dev/null +++ b/collects/tests/typed-scheme/fail/pr10350.rkt @@ -0,0 +1,12 @@ +#lang typed-scheme +(require/typed +scheme/base +[values (All (T) ((Any -> Boolean) -> (Any -> Boolean : T)))]) + +(: number->string? (Any -> Boolean : (Number -> String))) +(define (number->string? x) + (((inst values (Number -> String)) procedure?) x)) + +(: f (Number -> String)) +(define f + (if (number->string? +) + number->string)) \ No newline at end of file diff --git a/collects/tests/typed-scheme/succeed/pr10319.rkt b/collects/tests/typed-scheme/succeed/pr10319.rkt new file mode 100644 index 00000000..2da2e3c5 --- /dev/null +++ b/collects/tests/typed-scheme/succeed/pr10319.rkt @@ -0,0 +1,14 @@ + +#lang typed-scheme + +(define-type-alias LSN (Rec LSN (U '() (cons Number LSN) (cons Symbol LSN)))) + +(: sum (LSN -> Number)) +;; add all numbers in this lsn +(define (sum lsn) + (cond + [(null? lsn) 0] + [(number? (car lsn)) (+ (car lsn) (sum (cdr lsn)))] + [else (sum (cdr lsn))])) + +(sum '(a b 2 3)) \ No newline at end of file diff --git a/collects/tests/typed-scheme/succeed/pr10342.rkt b/collects/tests/typed-scheme/succeed/pr10342.rkt new file mode 100644 index 00000000..89056052 --- /dev/null +++ b/collects/tests/typed-scheme/succeed/pr10342.rkt @@ -0,0 +1,5 @@ +#lang typed-scheme +(require/typed + scheme/base + [opaque WeakBox weak-box?] + [make-weak-box (Any -> WeakBox)]) \ No newline at end of file diff --git a/collects/tests/typed-scheme/succeed/pr10562.rkt b/collects/tests/typed-scheme/succeed/pr10562.rkt new file mode 100644 index 00000000..8ba15861 --- /dev/null +++ b/collects/tests/typed-scheme/succeed/pr10562.rkt @@ -0,0 +1,4 @@ +#lang typed/racket +(: foo : (Rec this (List Number (Boxof (U #f this))))) +(define foo (list 1 (box #f))) +(set-box! (second foo) foo) diff --git a/collects/typed-scheme/types/abbrev.rkt b/collects/typed-scheme/types/abbrev.rkt index 3371df43..43bcdbbe 100644 --- a/collects/typed-scheme/types/abbrev.rkt +++ b/collects/typed-scheme/types/abbrev.rkt @@ -3,7 +3,7 @@ (require "../utils/utils.rkt") (require (rep type-rep object-rep filter-rep rep-utils) - "printer.rkt" "utils.rkt" + "printer.rkt" "utils.rkt" "resolve.rkt" (utils tc-utils) scheme/list scheme/match @@ -42,7 +42,7 @@ (foldr -pair (-val '()) l)) (define (untuple t) - (match t + (match (resolve t) [(Value: '()) null] [(Pair: a b) (cond [(untuple b) => (lambda (l) (cons a l))] [else #f])]