(define impc:ti:register-new-closure
(lambda (closure-name type zone-size docstring body)
;; (println 'closure-name: closure-name 'type: type 'docstring: docstring 'zone-size: zone-size 'body: body 'exists? (impc:ti:closure-exists? closure-name))
;; check arg types
(if (not (and (or (string? closure-name) (begin (println 'bad 'closure-name: closure-name) #f))
(or (list? type) (begin (println 'bad 'type: type) #f))
(or (number? zone-size) (begin (println 'bad 'zone-size: zone-size) #f))
(or (string? docstring) (begin (println 'bad 'docstring: docstring)))
(or (list? body) (begin (println 'bad 'body: body) #f))))
(impc:compiler:print-compiler-error "couldn't register new closure")
(if (impc:ti:closure-exists? closure-name)
(let ((t (impc:ti:get-closure-type closure-name)))
;; (println 'double-registration: (equal? t type) 'new: type 'extant: t)
(if (equal? t type)
(assoc-strcmp closure-name *impc:ti:closure-cache*)
(impc:compiler:print-already-bound-error closure-name (impc:ti:get-closure-type closure-name))))
;; create a new entry
(begin
(set! *impc:ti:closure-cache*
(cons (cons closure-name (vector type docstring zone-size body))
*impc:ti:closure-cache*))
(car *impc:ti:closure-cache*))))))