~ chicken-core (chicken-5) 30750024747f36e2e48d573722eebbbbf93eb544
commit 30750024747f36e2e48d573722eebbbbf93eb544
Author: felix <felix@z.(none)>
AuthorDate: Thu Mar 10 20:55:54 2011 +0100
Commit: felix <felix@z.(none)>
CommitDate: Thu Mar 10 20:55:54 2011 +0100
validate converts (... -> ...) type syntax
diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index 136b45bc..b889f7d3 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -1117,15 +1117,14 @@
(##sys#er-transformer
(lambda (x r c)
(##sys#check-syntax ': x '(_ symbol _))
- (let ((name (##sys#globalize (cadr x)))
- (type (##sys#strip-syntax (caddr x))))
- (validate-type type name)
- (cond ((memq #:csi ##sys#features) '(##core#undefined))
+ (let* ((name (##sys#globalize (cadr x)))
+ (type1 (##sys#strip-syntax (caddr x)))
+ (name1 (##sys#strip-syntax (cadr x)))
+ (type (validate-type type1 name1)))
+ (cond ((not type)
+ (syntax-error ': "invalid type syntax" name1 type1))
+ ((memq #:csi ##sys#features) '(##core#undefined))
(else
- (when (and (pair? type)
- (eq? 'procedure (car type))
- (not (symbol? (cadr type))))
- (set! type `(procedure ,(##sys#strip-syntax name) ,@(cdr type))))
`(##core#declare (type (,name ,type)))))))))
diff --git a/compiler.scm b/compiler.scm
index 2beb740a..277b5f92 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -1471,14 +1471,16 @@
(let ((name (globalize (car spec)))
(type (##sys#strip-syntax (cadr spec))))
(cond ((validate-type type name)
- (##sys#put! name '##core#type type)
- (##sys#put! name '##core#declared-type #t)
+ (mark-variable name '##core#type type)
+ (mark-variable name '##core#declared-type)
(when (pair? (cddr spec))
- (##sys#put!
+ (mark-variable
name '##core#specializations
(##sys#strip-syntax (cddr spec)))))
(else
- (warning "illegal type declaration" (##sys#strip-syntax spec)))))))
+ (warning
+ "illegal type declaration"
+ (##sys#strip-syntax spec)))))))
(cdr spec)))
((unsafe-specialized-arithmetic)
(set! unchecked-specialized-arithmetic #t))
diff --git a/scrutinizer.scm b/scrutinizer.scm
index a785b4ed..4aac1a35 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -745,26 +745,62 @@
(copy-node! (build-node-graph (subst template)) node)))
(define (validate-type type name)
+ ;; - returns converted type or #f
+ ;; - also converts "(... -> ...)" types
+ (define (upto lst p)
+ (let loop ((lst lst))
+ (cond ((eq? lst p) '())
+ (else (cons (car lst) (loop (cdr lst)))))))
(define (validate t)
(cond ((memq t '(* string symbol char number boolean list pair
procedure vector null eof undefined port blob
- pointer locative fixnum float pointer-vector deprecated)))
- ((not (pair? t)) #f)
+ pointer locative fixnum float pointer-vector
+ deprecated))
+ t)
+ ((not (pair? t)) t)
((eq? 'or (car t))
(and (list t)
- (every validate (cdr t))))
+ (let ((ts (map validate (cdr t))))
+ (and (every identity ts)
+ `(or ,@ts)))))
((eq? 'struct (car t))
- (and (= 2 (length t)) (symbol? (cadr t))))
+ (and (= 2 (length t))
+ (symbol? (cadr t))
+ t))
((eq? 'procedure (car t))
(and (pair? (cdr t))
- (let ((t (if (symbol? (cadr t)) (cddr t) (cdr t))))
- (and (pair? t)
- (list? (car t))
- (every
- validate
- (remove (cut memq <> '(#!optional #!rest values)) (car t)))
- (or (eq? '* (cddr t))
- (and (list? (cddr t))
- (every validate (cddr t))))))))
+ (let* ((name (if (symbol? (cadr t))
+ (cadr t)
+ name))
+ (t2 (if (symbol? (cadr t)) (cddr t) (cdr t))))
+ (and (pair? t2)
+ (list? (car t2))
+ (let ((ts (map (lambda (x)
+ (if (memq
+ x
+ '(#!optional #!rest values))
+ x
+ (validate x)))
+ (car t2))))
+ (and (every identity ts)
+ (let ((rt (if (eq? '* (cddr t2))
+ (cddr t2)
+ (and (list? (cddr t2))
+ (let ((rts
+ (map
+ validate
+ (cddr t2))))
+ (and (every identity rts)
+ rts))))))
+ (and rt
+ `(procedure
+ ,@(if name (list name) '())
+ ,ts
+ ,@rt)))))))))
+ ((and (pair? (cdr t)) (memq '-> (cadr t))) =>
+ (lambda (p)
+ (validate
+ `(procedure ,(upto t p) ,@(cdr p))
+ name)))
(else #f)))
(validate type))
Trap