~ chicken-core (chicken-5) 506ecbbe33efac6e466dda1c76011c0cb22e2ab8
commit 506ecbbe33efac6e466dda1c76011c0cb22e2ab8 Author: Evan Hanson <evhan@foldling.org> AuthorDate: Sun Aug 17 13:10:43 2014 +1200 Commit: Peter Bex <peter.bex@xs4all.nl> CommitDate: Sun Oct 19 14:21:49 2014 +0200 Add scrutiny special cases for drop & take This preserves the element types of pair and list arguments in the result types for these procedures where possible, similarly to the preexisting special cases for list-ref and list-tail. Signed-off-by: Peter Bex <peter.bex@xs4all.nl> diff --git a/scrutinizer.scm b/scrutinizer.scm index db15d6d6..25abc949 100644 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -2182,7 +2182,9 @@ ;;; List-related special cases ; -; Preserve known element types for list-ref, list-tail. +; Preserve known element types for: +; +; list-ref, list-tail, drop, take (let () @@ -2231,6 +2233,14 @@ (list (cadr result-type)))))) (define-special-case list-tail + (list+index-call-result-type-special-case + (lambda (_ result-type) (list result-type)))) + + (define-special-case take + (list+index-call-result-type-special-case + (lambda (result-type _) (list result-type)))) + + (define-special-case drop (list+index-call-result-type-special-case (lambda (_ result-type) (list result-type))))) diff --git a/tests/typematch-tests.scm b/tests/typematch-tests.scm index 85ada83f..40515957 100644 --- a/tests/typematch-tests.scm +++ b/tests/typematch-tests.scm @@ -1,7 +1,7 @@ ;;;; typematch-tests.scm -(use lolevel data-structures) +(use srfi-1 lolevel data-structures) (define-syntax check @@ -276,6 +276,16 @@ (mx (list float) (list-tail (list 1 2.3) 1)) (mx float (list-tail (cons 1 2.3) 1)) (mx null (list-tail (list 1 2.3) 2)) +(mx (list fixnum float) (drop (list 1 2.3) 0)) +(mx (pair fixnum float) (drop (cons 1 2.3) 0)) +(mx (list float) (drop (list 1 2.3) 1)) +(mx float (drop (cons 1 2.3) 1)) +(mx null (drop (list 1 2.3) 2)) +(mx null (take (list 1 2.3) 0)) +(mx null (take (cons 1 2.3) 0)) +(mx (list fixnum) (take (list 1 2.3) 1)) +(mx (list fixnum) (take (cons 1 2.3) 1)) +(mx (list fixnum float) (take (list 1 2.3) 2)) (: f1 (forall (a) ((list-of a) -> a))) (define (f1 x) (car x))Trap