~ chicken-core (chicken-5) 353cf3afdc8cf5b7ef481a6db9ff4c6545923d43
commit 353cf3afdc8cf5b7ef481a6db9ff4c6545923d43 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Mar 17 12:42:28 2011 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Mar 17 12:42:28 2011 +0100 validate-type cleans up and validates llists diff --git a/expand.scm b/expand.scm index 05d0c54b..264bd519 100644 --- a/expand.scm +++ b/expand.scm @@ -127,7 +127,8 @@ (define (##sys#globalize sym se) (if (symbol? sym) (let loop ((se se)) ; ignores syntax bindings - (cond ((null? se) (##sys#alias-global-hook sym #f #f)) ;XXX could hint at decl (3rd arg) + (cond ((null? se) + (##sys#alias-global-hook sym #f #f)) ;XXX could hint at decl (3rd arg) ((and (eq? sym (caar se)) (symbol? (cdar se))) (cdar se)) (else (loop (cdr se))))) sym)) diff --git a/scrutinizer.scm b/scrutinizer.scm index 4aac1a35..a4c92e7f 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -747,10 +747,26 @@ (define (validate-type type name) ;; - returns converted type or #f ;; - also converts "(... -> ...)" types + ;; - drops "#!key ..." args by converting to #!rest (define (upto lst p) (let loop ((lst lst)) (cond ((eq? lst p) '()) (else (cons (car lst) (loop (cdr lst))))))) + (define (validate-llist llist) + (cond ((null? llist) '()) + ((symbol? llist) '(#!rest *)) + ((not (pair? llist)) #f) + ((eq? '#!optional (car llist)) + (cons '#!optional (validate-llist (cdr llist)))) + ((eq? '#!rest (car llist)) + (cond ((null? (cdr llist)) '(#!rest *)) + ((not (pair? (cdr llist))) #f) + ((and (pair? (cddr llist)) + (eq? '#!key (caddr llist))) + `(#!rest ,(validate (cadr llist)))) + (else #f))) + ((eq? '#!key (car llist)) '(#!rest *)) + (else (cons (validate (car llist)) (validate-llist (cdr llist)))))) (define (validate t) (cond ((memq t '(* string symbol char number boolean list pair procedure vector null eof undefined port blob @@ -775,14 +791,9 @@ (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 ((ts (validate-llist (car t2)))) + (and ts + (every identity ts) (let ((rt (if (eq? '* (cddr t2)) (cddr t2) (and (list? (cddr t2))Trap