impc:ti:register-new-closure   scheme


Defined in:  https://github.com/digego/extempore/tree/v0.8.9/runtime/llvmti.xtm

Implementation

(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*))))))


Back to Index