diff --git a/host/chez/host-contract.ss b/host/chez/host-contract.ss index d747902..b3b61c1 100644 --- a/host/chez/host-contract.ss +++ b/host/chez/host-contract.ss @@ -215,12 +215,23 @@ (if (fx>=? i (pvec-count items)) s (loop (fx+ i 1) (pset-conj s (pvec-nth-d items i jolt-nil)))))) x)) -(define (hc-expand-1 ctx form) +;; &form and &env are bound (as dynamic vars) around the expander call, so a +;; macro body can read the call form / lexical env without changing the calling +;; convention. The analyzer passes amp-env (the in-scope locals); macroexpand-1 +;; has none, so it defaults to {}. +(define hc-amp-form-cell (declare-var! "clojure.core" "&form")) +(define hc-amp-env-cell (declare-var! "clojure.core" "&env")) +(define (hc-expand-1 ctx form . maybe-env) (let* ((items (seq->list form)) (head (car items)) (args (map hc-macro-arg (cdr items))) - (expander (var-cell-root (hc-resolve-cell ctx head)))) - (hc-propagate-pos form (apply jolt-invoke expander args)))) + (expander (var-cell-root (hc-resolve-cell ctx head))) + (amp-env (if (pair? maybe-env) (car maybe-env) (jolt-hash-map)))) + (dynamic-wind + (lambda () (jolt-push-thread-bindings + (jolt-hash-map hc-amp-form-cell form hc-amp-env-cell amp-env))) + (lambda () (hc-propagate-pos form (apply jolt-invoke expander args))) + (lambda () (jolt-pop-thread-bindings))))) ;; Classify a global (non-local) symbol reference against the var registry: ;; {:kind :var :ns NS :name NAME} — a defined var (compile ns / clojure.core) @@ -298,10 +309,15 @@ ;; Any seq counts, not just a proper list: a macro that builds the template with ;; map/for (e.g. deftype's rewrite-set) yields a LAZY seq, and its ~unquotes must ;; still be recognized. +;; head symbol matches name nm, bare or clojure.core-qualified — the reader +;; produces clojure.core/unquote(-splicing) for ~/~@ (JVM parity), and this is +;; only used to spot those heads in syntax-quote templates. (define (hc-head-is? x nm) (and (cseq? x) (let ((h (seq-first x))) - (and (symbol-t? h) (jolt-nil? (hc-sym-ns h)) (string=? (symbol-t-name h) nm))))) + (and (symbol-t? h) (string=? (symbol-t-name h) nm) + (let ((ns (hc-sym-ns h))) + (or (jolt-nil? ns) (and (string? ns) (string=? ns "clojure.core")))))))) (define (hc-second x) (seq-first (jolt-seq (seq-more x)))) (define (hc-sq-symbol ctx form gsmap) diff --git a/host/chez/java/records-interop.ss b/host/chez/java/records-interop.ss index b8c564b..356ec28 100644 --- a/host/chez/java/records-interop.ss +++ b/host/chez/java/records-interop.ss @@ -93,8 +93,13 @@ ((jrec? val) (let ((tag (jrec-tag val))) (or (string=? tag tname) - (and (> (string-length tag) (string-length tname)) - (string=? (substring tag (- (string-length tag) (string-length tname)) (string-length tag)) tname)) + ;; a simple name matches a qualified tag only at a `.` boundary: + ;; "a.b.IntervalFD" is an IntervalFD, but "a.b.MultiIntervalFD" is NOT + ;; (a raw string-suffix would wrongly match the latter). + (let ((tl (string-length tag)) (nl (string-length tname))) + (and (fx>? tl nl) + (char=? (string-ref tag (fx- (fx- tl nl) 1)) #\.) + (string=? (substring tag (fx- tl nl) tl) tname))) ;; a protocol/interface the type implements (defprotocol generates an ;; interface; (instance? SomeProtocol record) is true when the record ;; implements it — core.match dispatches on instance? IPatternCompile). diff --git a/host/chez/reader.ss b/host/chez/reader.ss index 9d6be3c..db4e4db 100644 --- a/host/chez/reader.ss +++ b/host/chez/reader.ss @@ -589,10 +589,13 @@ (jolt-list (jolt-symbol #f "syntax-quote") form)) j))) ((char=? c #\@) (rdr-wrap s (+ i 1) end (jolt-symbol "clojure.core" "deref"))) + ;; ~ / ~@ read as clojure.core/unquote(-splicing), like the JVM reader — + ;; so code that inspects pattern/template data (core.logic's defne) sees + ;; the qualified symbol it expects. ((char=? c #\~) (if (and (< (+ i 1) end) (char=? (string-ref s (+ i 1)) #\@)) - (rdr-wrap s (+ i 2) end (jolt-symbol #f "unquote-splicing")) - (rdr-wrap s (+ i 1) end (jolt-symbol #f "unquote")))) + (rdr-wrap s (+ i 2) end (jolt-symbol "clojure.core" "unquote-splicing")) + (rdr-wrap s (+ i 1) end (jolt-symbol "clojure.core" "unquote")))) ((char=? c #\^) (let-values (((mform j) (rdr-read-form s (+ i 1) end))) (let-values (((target k) (rdr-read-form s j end))) diff --git a/host/chez/seed/image.ss b/host/chez/seed/image.ss index 3e5f403..e3cce26 100644 --- a/host/chez/seed/image.ss +++ b/host/chez/seed/image.ss @@ -57,73 +57,75 @@ (guard (e (#t #f)) (def-var-with-meta! "jolt.analyzer" "add-locals" (letrec ((add-locals (lambda (env names) (let fnrec8512 ((env env) (names names)) (jolt-invoke (var-deref "clojure.core" "update") env (keyword #f "locals") (lambda (p__90_) (let fnrec8513 ((p__90_ p__90_)) (jolt-reduce jolt-conj p__90_ names)))))))) add-locals) (let* ((_o$8514 (keyword #f "private")) (_o$8515 #t)) (jolt-hash-map _o$8514 _o$8515)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "with-recur" (letrec ((with-recur (lambda (env name) (let fnrec8516 ((env env) (name name)) (jolt-assoc env (keyword #f "recur") name))))) with-recur) (let* ((_o$8517 (keyword #f "private")) (_o$8518 #t)) (jolt-hash-map _o$8517 _o$8518)))) + (def-var-with-meta! "jolt.analyzer" "amp-env-map" (letrec ((amp-env-map (lambda (env) (let fnrec8516 ((env env)) (let* ((_a$8518 (lambda (m n) (let fnrec8517 ((m m) (n n)) (jolt-assoc m (jolt-invoke (var-deref "clojure.core" "symbol") n) jolt-nil)))) (_a$8519 (jolt-hash-map)) (_a$8520 (jolt-get env (keyword #f "locals")))) (jolt-reduce _a$8518 _a$8519 _a$8520)))))) amp-env-map) (let* ((_o$8521 (keyword #f "private")) (_o$8522 #t)) (jolt-hash-map _o$8521 _o$8522)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "hint-of" (letrec ((hint-of (lambda (ctx sym) (let fnrec8519 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-nil? m) jolt-nil (if (jolt-truthy? (jolt-get m (keyword #f "struct"))) (keyword #f "struct") (if (jolt-truthy? (keyword #f "else")) (let* ((t (jolt-get m (keyword #f "tag")))) (if (jolt-truthy? (let* ((and__25__auto t)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "record-type?") ctx t) and__25__auto))) (keyword #f "struct") jolt-nil)) jolt-nil)))))))) hint-of) (let* ((_o$8520 (keyword #f "private")) (_o$8521 #t)) (jolt-hash-map _o$8520 _o$8521)))) + (def-var-with-meta! "jolt.analyzer" "with-recur" (letrec ((with-recur (lambda (env name) (let fnrec8523 ((env env) (name name)) (jolt-assoc env (keyword #f "recur") name))))) with-recur) (let* ((_o$8524 (keyword #f "private")) (_o$8525 #t)) (jolt-hash-map _o$8524 _o$8525)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "add-hint" (letrec ((add-hint (lambda (env nm h) (let fnrec8522 ((env env) (nm nm) (h h)) (if (jolt-truthy? h) (jolt-assoc env (keyword #f "hints") (jolt-assoc (jolt-get env (keyword #f "hints")) nm h)) env))))) add-hint) (let* ((_o$8523 (keyword #f "private")) (_o$8524 #t)) (jolt-hash-map _o$8523 _o$8524)))) + (def-var-with-meta! "jolt.analyzer" "hint-of" (letrec ((hint-of (lambda (ctx sym) (let fnrec8526 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-nil? m) jolt-nil (if (jolt-truthy? (jolt-get m (keyword #f "struct"))) (keyword #f "struct") (if (jolt-truthy? (keyword #f "else")) (let* ((t (jolt-get m (keyword #f "tag")))) (if (jolt-truthy? (let* ((and__25__auto t)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "record-type?") ctx t) and__25__auto))) (keyword #f "struct") jolt-nil)) jolt-nil)))))))) hint-of) (let* ((_o$8527 (keyword #f "private")) (_o$8528 #t)) (jolt-hash-map _o$8527 _o$8528)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "phint-of" (letrec ((phint-of (lambda (ctx sym) (let fnrec8525 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-truthy? m) (let* ((t (jolt-get m (keyword #f "tag")))) (if (jolt-truthy? t) (jolt-invoke (var-deref "jolt.host" "record-ctor-key") ctx t) jolt-nil)) jolt-nil)))))) phint-of) (let* ((_o$8526 (keyword #f "private")) (_o$8527 #t)) (jolt-hash-map _o$8526 _o$8527)))) + (def-var-with-meta! "jolt.analyzer" "add-hint" (letrec ((add-hint (lambda (env nm h) (let fnrec8529 ((env env) (nm nm) (h h)) (if (jolt-truthy? h) (jolt-assoc env (keyword #f "hints") (jolt-assoc (jolt-get env (keyword #f "hints")) nm h)) env))))) add-hint) (let* ((_o$8530 (keyword #f "private")) (_o$8531 #t)) (jolt-hash-map _o$8530 _o$8531)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "tag->nkind" (letrec ((tag->nkind (lambda (t) (let fnrec8528 ((t t)) (let* ((s (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") t)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") t) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") t)) t (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil))))) (if (jolt= s "double") (keyword #f "double") (if (jolt= s "long") (keyword #f "long") (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))))))) tag->nkind) (let* ((_o$8529 (keyword #f "private")) (_o$8530 #t)) (jolt-hash-map _o$8529 _o$8530)))) + (def-var-with-meta! "jolt.analyzer" "phint-of" (letrec ((phint-of (lambda (ctx sym) (let fnrec8532 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-truthy? m) (let* ((t (jolt-get m (keyword #f "tag")))) (if (jolt-truthy? t) (jolt-invoke (var-deref "jolt.host" "record-ctor-key") ctx t) jolt-nil)) jolt-nil)))))) phint-of) (let* ((_o$8533 (keyword #f "private")) (_o$8534 #t)) (jolt-hash-map _o$8533 _o$8534)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "nhint-of" (letrec ((nhint-of (lambda (ctx sym) (let fnrec8531 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-truthy? m) (jolt-invoke (var-deref "jolt.analyzer" "tag->nkind") (jolt-get m (keyword #f "tag"))) jolt-nil)))))) nhint-of) (let* ((_o$8532 (keyword #f "private")) (_o$8533 #t)) (jolt-hash-map _o$8532 _o$8533)))) + (def-var-with-meta! "jolt.analyzer" "tag->nkind" (letrec ((tag->nkind (lambda (t) (let fnrec8535 ((t t)) (let* ((s (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") t)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") t) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") t)) t (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil))))) (if (jolt= s "double") (keyword #f "double") (if (jolt= s "long") (keyword #f "long") (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))))))) tag->nkind) (let* ((_o$8536 (keyword #f "private")) (_o$8537 #t)) (jolt-hash-map _o$8536 _o$8537)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "with-ret-nhint" (letrec ((with-ret-nhint (lambda (node kind) (let fnrec8534 ((node node) (kind kind)) (if (jolt-truthy? (let* ((and__25__auto kind)) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "fn") (jolt-get node (keyword #f "op"))) and__25__auto))) (jolt-assoc node (keyword #f "arities") (let* ((_a$8536 (var-deref "clojure.core" "mapv")) (_a$8537 (lambda (a) (let fnrec8535 ((a a)) (if (jolt-truthy? (jolt-get a (keyword #f "ret-nhint"))) a (jolt-assoc a (keyword #f "ret-nhint") kind))))) (_a$8538 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$8536 _a$8537 _a$8538))) node))))) with-ret-nhint) (let* ((_o$8539 (keyword #f "private")) (_o$8540 #t)) (jolt-hash-map _o$8539 _o$8540)))) + (def-var-with-meta! "jolt.analyzer" "nhint-of" (letrec ((nhint-of (lambda (ctx sym) (let fnrec8538 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-truthy? m) (jolt-invoke (var-deref "jolt.analyzer" "tag->nkind") (jolt-get m (keyword #f "tag"))) jolt-nil)))))) nhint-of) (let* ((_o$8539 (keyword #f "private")) (_o$8540 #t)) (jolt-hash-map _o$8539 _o$8540)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-seq" (letrec ((analyze-seq (lambda (ctx forms env) (let fnrec8541 ((ctx ctx) (forms forms) (env env)) (let* ((v (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__91_) (let fnrec8542 ((p__91_ p__91_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__91_ env))) forms)) (n (jolt-count v))) (if (jolt-zero? n) (jolt-invoke (var-deref "jolt.ir" "const") jolt-nil) (if (jolt= 1 n) (jolt-first v) (if (jolt-truthy? (keyword #f "else")) (let* ((_a$8543 (var-deref "jolt.ir" "do-node")) (_a$8544 (jolt-invoke (var-deref "clojure.core" "subvec") v 0 (jolt-dec n))) (_a$8545 (jolt-peek v))) (jolt-invoke _a$8543 _a$8544 _a$8545)) jolt-nil)))))))) analyze-seq) (let* ((_o$8546 (keyword #f "private")) (_o$8547 #t)) (jolt-hash-map _o$8546 _o$8547)))) + (def-var-with-meta! "jolt.analyzer" "with-ret-nhint" (letrec ((with-ret-nhint (lambda (node kind) (let fnrec8541 ((node node) (kind kind)) (if (jolt-truthy? (let* ((and__25__auto kind)) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "fn") (jolt-get node (keyword #f "op"))) and__25__auto))) (jolt-assoc node (keyword #f "arities") (let* ((_a$8543 (var-deref "clojure.core" "mapv")) (_a$8544 (lambda (a) (let fnrec8542 ((a a)) (if (jolt-truthy? (jolt-get a (keyword #f "ret-nhint"))) a (jolt-assoc a (keyword #f "ret-nhint") kind))))) (_a$8545 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$8543 _a$8544 _a$8545))) node))))) with-ret-nhint) (let* ((_o$8546 (keyword #f "private")) (_o$8547 #t)) (jolt-hash-map _o$8546 _o$8547)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-bindings" (letrec ((analyze-bindings (lambda (ctx bvec env) (let fnrec8548 ((ctx ctx) (bvec bvec) (env env)) (let* ((i 0) (env env) (pairs (jolt-vector))) (let loop8549 ((i i) (env env) (pairs pairs)) (if (< i (jolt-count bvec)) (let* ((bsym (jolt-nth bvec i))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") bsym)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "destructuring binding") jolt-nil) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") bsym)) (init (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth bvec (jolt-inc i)) env))) (let* ((_a$8556 (+ i 2)) (_a$8557 (let* ((_a$8550 (var-deref "jolt.analyzer" "add-hint")) (_a$8551 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector nm))) (_a$8552 nm) (_a$8553 (jolt-invoke (var-deref "jolt.analyzer" "hint-of") ctx bsym))) (jolt-invoke _a$8550 _a$8551 _a$8552 _a$8553))) (_a$8558 (jolt-conj pairs (let* ((_o$8554 nm) (_o$8555 init)) (jolt-vector _o$8554 _o$8555))))) (loop8549 _a$8556 _a$8557 _a$8558))))) (let* ((_o$8559 pairs) (_o$8560 env)) (jolt-vector _o$8559 _o$8560))))))))) analyze-bindings) (let* ((_o$8561 (keyword #f "private")) (_o$8562 #t)) (jolt-hash-map _o$8561 _o$8562)))) + (def-var-with-meta! "jolt.analyzer" "analyze-seq" (letrec ((analyze-seq (lambda (ctx forms env) (let fnrec8548 ((ctx ctx) (forms forms) (env env)) (let* ((v (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__91_) (let fnrec8549 ((p__91_ p__91_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__91_ env))) forms)) (n (jolt-count v))) (if (jolt-zero? n) (jolt-invoke (var-deref "jolt.ir" "const") jolt-nil) (if (jolt= 1 n) (jolt-first v) (if (jolt-truthy? (keyword #f "else")) (let* ((_a$8550 (var-deref "jolt.ir" "do-node")) (_a$8551 (jolt-invoke (var-deref "clojure.core" "subvec") v 0 (jolt-dec n))) (_a$8552 (jolt-peek v))) (jolt-invoke _a$8550 _a$8551 _a$8552)) jolt-nil)))))))) analyze-seq) (let* ((_o$8553 (keyword #f "private")) (_o$8554 #t)) (jolt-hash-map _o$8553 _o$8554)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "parse-params" (letrec ((parse-params (lambda (ctx pvec) (let fnrec8563 ((ctx ctx) (pvec pvec)) (let* ((i 0) (fixed (jolt-vector)) (rest-name jolt-nil) (hints (jolt-vector)) (phints (jolt-vector)) (nhints (jolt-vector))) (let loop8564 ((i i) (fixed fixed) (rest-name rest-name) (hints hints) (phints phints) (nhints nhints)) (if (< i (jolt-count pvec)) (let* ((p (jolt-nth pvec i))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") p)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "destructuring fn param") jolt-nil) (if (jolt= "&" (jolt-invoke (var-deref "jolt.host" "form-sym-name") p)) (let* ((r (jolt-nth pvec (jolt-inc i)))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") r)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "destructuring fn rest") jolt-nil) (let* ((_a$8565 (+ i 2)) (_a$8566 fixed) (_a$8567 (jolt-invoke (var-deref "jolt.host" "form-sym-name") r)) (_a$8568 hints) (_a$8569 phints) (_a$8570 nhints)) (loop8564 _a$8565 _a$8566 _a$8567 _a$8568 _a$8569 _a$8570)))) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") p)) (h (jolt-invoke (var-deref "jolt.analyzer" "hint-of") ctx p)) (ph (jolt-invoke (var-deref "jolt.analyzer" "phint-of") ctx p)) (nh (jolt-invoke (var-deref "jolt.analyzer" "nhint-of") ctx p))) (let* ((_a$8577 (jolt-inc i)) (_a$8578 (jolt-conj fixed nm)) (_a$8579 rest-name) (_a$8580 (if (jolt-truthy? h) (jolt-conj hints (let* ((_o$8571 nm) (_o$8572 h)) (jolt-vector _o$8571 _o$8572))) hints)) (_a$8581 (if (jolt-truthy? ph) (jolt-conj phints (let* ((_o$8573 nm) (_o$8574 ph)) (jolt-vector _o$8573 _o$8574))) phints)) (_a$8582 (if (jolt-truthy? nh) (jolt-conj nhints (let* ((_o$8575 nm) (_o$8576 nh)) (jolt-vector _o$8575 _o$8576))) nhints))) (loop8564 _a$8577 _a$8578 _a$8579 _a$8580 _a$8581 _a$8582)))))) (let* ((_o$8583 (keyword #f "fixed")) (_o$8584 fixed) (_o$8585 (keyword #f "rest")) (_o$8586 rest-name) (_o$8587 (keyword #f "hints")) (_o$8588 hints) (_o$8589 (keyword #f "phints")) (_o$8590 phints) (_o$8591 (keyword #f "nhints")) (_o$8592 nhints)) (jolt-hash-map _o$8583 _o$8584 _o$8585 _o$8586 _o$8587 _o$8588 _o$8589 _o$8590 _o$8591 _o$8592))))))))) parse-params) (let* ((_o$8593 (keyword #f "private")) (_o$8594 #t)) (jolt-hash-map _o$8593 _o$8594)))) + (def-var-with-meta! "jolt.analyzer" "analyze-bindings" (letrec ((analyze-bindings (lambda (ctx bvec env) (let fnrec8555 ((ctx ctx) (bvec bvec) (env env)) (let* ((i 0) (env env) (pairs (jolt-vector))) (let loop8556 ((i i) (env env) (pairs pairs)) (if (< i (jolt-count bvec)) (let* ((bsym (jolt-nth bvec i))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") bsym)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "destructuring binding") jolt-nil) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") bsym)) (init (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth bvec (jolt-inc i)) env))) (let* ((_a$8563 (+ i 2)) (_a$8564 (let* ((_a$8557 (var-deref "jolt.analyzer" "add-hint")) (_a$8558 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector nm))) (_a$8559 nm) (_a$8560 (jolt-invoke (var-deref "jolt.analyzer" "hint-of") ctx bsym))) (jolt-invoke _a$8557 _a$8558 _a$8559 _a$8560))) (_a$8565 (jolt-conj pairs (let* ((_o$8561 nm) (_o$8562 init)) (jolt-vector _o$8561 _o$8562))))) (loop8556 _a$8563 _a$8564 _a$8565))))) (let* ((_o$8566 pairs) (_o$8567 env)) (jolt-vector _o$8566 _o$8567))))))))) analyze-bindings) (let* ((_o$8568 (keyword #f "private")) (_o$8569 #t)) (jolt-hash-map _o$8568 _o$8569)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "uniquify-params" (letrec ((uniquify-params (lambda (names) (let fnrec8595 ((names names)) (let* ((n (jolt-count names))) (let* ((i 0) (out (jolt-vector))) (let loop8596 ((i i) (out out)) (if (< i n) (let* ((nm (jolt-nth names i)) (dup? (let* ((j (jolt-inc i))) (let loop8597 ((j j)) (if (>= j n) #f (if (jolt= nm (jolt-nth names j)) #t (if (jolt-truthy? (keyword #f "else")) (loop8597 (jolt-inc j)) jolt-nil))))))) (let* ((_a$8598 (jolt-inc i)) (_a$8599 (jolt-conj out (if (jolt-truthy? dup?) (jolt-invoke (var-deref "jolt.analyzer" "gen-name") (jolt-invoke (var-deref "clojure.core" "str") nm "_")) nm)))) (loop8596 _a$8598 _a$8599))) out)))))))) uniquify-params) (let* ((_o$8600 (keyword #f "private")) (_o$8601 #t)) (jolt-hash-map _o$8600 _o$8601)))) + (def-var-with-meta! "jolt.analyzer" "parse-params" (letrec ((parse-params (lambda (ctx pvec) (let fnrec8570 ((ctx ctx) (pvec pvec)) (let* ((i 0) (fixed (jolt-vector)) (rest-name jolt-nil) (hints (jolt-vector)) (phints (jolt-vector)) (nhints (jolt-vector))) (let loop8571 ((i i) (fixed fixed) (rest-name rest-name) (hints hints) (phints phints) (nhints nhints)) (if (< i (jolt-count pvec)) (let* ((p (jolt-nth pvec i))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") p)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "destructuring fn param") jolt-nil) (if (jolt= "&" (jolt-invoke (var-deref "jolt.host" "form-sym-name") p)) (let* ((r (jolt-nth pvec (jolt-inc i)))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") r)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "destructuring fn rest") jolt-nil) (let* ((_a$8572 (+ i 2)) (_a$8573 fixed) (_a$8574 (jolt-invoke (var-deref "jolt.host" "form-sym-name") r)) (_a$8575 hints) (_a$8576 phints) (_a$8577 nhints)) (loop8571 _a$8572 _a$8573 _a$8574 _a$8575 _a$8576 _a$8577)))) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") p)) (h (jolt-invoke (var-deref "jolt.analyzer" "hint-of") ctx p)) (ph (jolt-invoke (var-deref "jolt.analyzer" "phint-of") ctx p)) (nh (jolt-invoke (var-deref "jolt.analyzer" "nhint-of") ctx p))) (let* ((_a$8584 (jolt-inc i)) (_a$8585 (jolt-conj fixed nm)) (_a$8586 rest-name) (_a$8587 (if (jolt-truthy? h) (jolt-conj hints (let* ((_o$8578 nm) (_o$8579 h)) (jolt-vector _o$8578 _o$8579))) hints)) (_a$8588 (if (jolt-truthy? ph) (jolt-conj phints (let* ((_o$8580 nm) (_o$8581 ph)) (jolt-vector _o$8580 _o$8581))) phints)) (_a$8589 (if (jolt-truthy? nh) (jolt-conj nhints (let* ((_o$8582 nm) (_o$8583 nh)) (jolt-vector _o$8582 _o$8583))) nhints))) (loop8571 _a$8584 _a$8585 _a$8586 _a$8587 _a$8588 _a$8589)))))) (let* ((_o$8590 (keyword #f "fixed")) (_o$8591 fixed) (_o$8592 (keyword #f "rest")) (_o$8593 rest-name) (_o$8594 (keyword #f "hints")) (_o$8595 hints) (_o$8596 (keyword #f "phints")) (_o$8597 phints) (_o$8598 (keyword #f "nhints")) (_o$8599 nhints)) (jolt-hash-map _o$8590 _o$8591 _o$8592 _o$8593 _o$8594 _o$8595 _o$8596 _o$8597 _o$8598 _o$8599))))))))) parse-params) (let* ((_o$8600 (keyword #f "private")) (_o$8601 #t)) (jolt-hash-map _o$8600 _o$8601)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-arity" (letrec ((analyze-arity (lambda (ctx pvec body env fn-name) (let fnrec8602 ((ctx ctx) (pvec pvec) (body body) (env env) (fn-name fn-name)) (let* ((pp (jolt-invoke (var-deref "jolt.analyzer" "parse-params") ctx (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") pvec)))) (fixed (jolt-invoke (var-deref "jolt.analyzer" "uniquify-params") (jolt-get pp (keyword #f "fixed")))) (rst (jolt-get pp (keyword #f "rest"))) (rname (jolt-invoke (var-deref "jolt.analyzer" "gen-name") (let* ((_a$8603 (var-deref "clojure.core" "str")) (_a$8604 (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (_a$8605 "/") (_a$8606 (let* ((or__26__auto fn-name)) (if (jolt-truthy? or__26__auto) or__26__auto "fn"))) (_a$8607 "--")) (jolt-invoke _a$8603 _a$8604 _a$8605 _a$8606 _a$8607)))) (names (let* ((G__146 (jolt-invoke (var-deref "clojure.core" "vec") fixed))) (let* ((G__147 (if (jolt-truthy? rst) (jolt-conj G__146 rst) G__146))) (let* ((G__148 (if (jolt-truthy? fn-name) (jolt-conj G__147 fn-name) G__147))) G__148)))) (env0 (jolt-invoke (var-deref "jolt.analyzer" "with-recur") (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names) rname)) (env* (let* ((_a$8613 (lambda (e pr) (let fnrec8608 ((e e) (pr pr)) (let* ((_a$8609 (var-deref "jolt.analyzer" "add-hint")) (_a$8610 e) (_a$8611 (jolt-nth pr 0)) (_a$8612 (jolt-nth pr 1))) (jolt-invoke _a$8609 _a$8610 _a$8611 _a$8612))))) (_a$8614 env0) (_a$8615 (jolt-get pp (keyword #f "hints")))) (jolt-reduce _a$8613 _a$8614 _a$8615))) (arity (let* ((_o$8616 (keyword #f "params")) (_o$8617 fixed) (_o$8618 (keyword #f "recur-name")) (_o$8619 rname) (_o$8620 (keyword #f "body")) (_o$8621 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx body env*))) (jolt-hash-map _o$8616 _o$8617 _o$8618 _o$8619 _o$8620 _o$8621))) (arity (if (jolt-truthy? (jolt-seq (jolt-get pp (keyword #f "phints")))) (jolt-assoc arity (keyword #f "phints") (jolt-get pp (keyword #f "phints"))) arity)) (arity (if (jolt-truthy? (jolt-seq (jolt-get pp (keyword #f "nhints")))) (jolt-assoc arity (keyword #f "nhints") (jolt-get pp (keyword #f "nhints"))) arity))) (if (jolt-truthy? rst) (jolt-assoc arity (keyword #f "rest") rst) arity)))))) analyze-arity) (let* ((_o$8622 (keyword #f "private")) (_o$8623 #t)) (jolt-hash-map _o$8622 _o$8623)))) + (def-var-with-meta! "jolt.analyzer" "uniquify-params" (letrec ((uniquify-params (lambda (names) (let fnrec8602 ((names names)) (let* ((n (jolt-count names))) (let* ((i 0) (out (jolt-vector))) (let loop8603 ((i i) (out out)) (if (< i n) (let* ((nm (jolt-nth names i)) (dup? (let* ((j (jolt-inc i))) (let loop8604 ((j j)) (if (>= j n) #f (if (jolt= nm (jolt-nth names j)) #t (if (jolt-truthy? (keyword #f "else")) (loop8604 (jolt-inc j)) jolt-nil))))))) (let* ((_a$8605 (jolt-inc i)) (_a$8606 (jolt-conj out (if (jolt-truthy? dup?) (jolt-invoke (var-deref "jolt.analyzer" "gen-name") (jolt-invoke (var-deref "clojure.core" "str") nm "_")) nm)))) (loop8603 _a$8605 _a$8606))) out)))))))) uniquify-params) (let* ((_o$8607 (keyword #f "private")) (_o$8608 #t)) (jolt-hash-map _o$8607 _o$8608)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "strip-arglist-meta" (letrec ((strip-arglist-meta (lambda (form) (let fnrec8624 ((form form)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") form)) (let* ((es (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") form)))) (if (jolt-truthy? (let* ((and__25__auto (jolt= 3 (jolt-count es)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first es)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "with-meta" (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first es))))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-vec?") (jolt-nth es 1)) and__25__auto)) and__25__auto)) and__25__auto))) (jolt-nth es 1) form)) form))))) strip-arglist-meta) (let* ((_o$8625 (keyword #f "private")) (_o$8626 #t)) (jolt-hash-map _o$8625 _o$8626)))) + (def-var-with-meta! "jolt.analyzer" "analyze-arity" (letrec ((analyze-arity (lambda (ctx pvec body env fn-name) (let fnrec8609 ((ctx ctx) (pvec pvec) (body body) (env env) (fn-name fn-name)) (let* ((pp (jolt-invoke (var-deref "jolt.analyzer" "parse-params") ctx (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") pvec)))) (fixed (jolt-invoke (var-deref "jolt.analyzer" "uniquify-params") (jolt-get pp (keyword #f "fixed")))) (rst (jolt-get pp (keyword #f "rest"))) (rname (jolt-invoke (var-deref "jolt.analyzer" "gen-name") (let* ((_a$8610 (var-deref "clojure.core" "str")) (_a$8611 (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (_a$8612 "/") (_a$8613 (let* ((or__26__auto fn-name)) (if (jolt-truthy? or__26__auto) or__26__auto "fn"))) (_a$8614 "--")) (jolt-invoke _a$8610 _a$8611 _a$8612 _a$8613 _a$8614)))) (names (let* ((G__146 (jolt-invoke (var-deref "clojure.core" "vec") fixed))) (let* ((G__147 (if (jolt-truthy? rst) (jolt-conj G__146 rst) G__146))) (let* ((G__148 (if (jolt-truthy? fn-name) (jolt-conj G__147 fn-name) G__147))) G__148)))) (env0 (jolt-invoke (var-deref "jolt.analyzer" "with-recur") (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names) rname)) (env* (let* ((_a$8620 (lambda (e pr) (let fnrec8615 ((e e) (pr pr)) (let* ((_a$8616 (var-deref "jolt.analyzer" "add-hint")) (_a$8617 e) (_a$8618 (jolt-nth pr 0)) (_a$8619 (jolt-nth pr 1))) (jolt-invoke _a$8616 _a$8617 _a$8618 _a$8619))))) (_a$8621 env0) (_a$8622 (jolt-get pp (keyword #f "hints")))) (jolt-reduce _a$8620 _a$8621 _a$8622))) (arity (let* ((_o$8623 (keyword #f "params")) (_o$8624 fixed) (_o$8625 (keyword #f "recur-name")) (_o$8626 rname) (_o$8627 (keyword #f "body")) (_o$8628 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx body env*))) (jolt-hash-map _o$8623 _o$8624 _o$8625 _o$8626 _o$8627 _o$8628))) (arity (if (jolt-truthy? (jolt-seq (jolt-get pp (keyword #f "phints")))) (jolt-assoc arity (keyword #f "phints") (jolt-get pp (keyword #f "phints"))) arity)) (arity (if (jolt-truthy? (jolt-seq (jolt-get pp (keyword #f "nhints")))) (jolt-assoc arity (keyword #f "nhints") (jolt-get pp (keyword #f "nhints"))) arity))) (if (jolt-truthy? rst) (jolt-assoc arity (keyword #f "rest") rst) arity)))))) analyze-arity) (let* ((_o$8629 (keyword #f "private")) (_o$8630 #t)) (jolt-hash-map _o$8629 _o$8630)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-fn" (letrec ((analyze-fn (lambda (ctx items env) (let fnrec8627 ((ctx ctx) (items items) (env env)) (let* ((named (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1))) (fn-name (if (jolt-truthy? named) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1)) jolt-nil)) (rest-items (if (jolt-truthy? named) (jolt-drop 2 items) (jolt-drop 1 items))) (first* (jolt-invoke (var-deref "jolt.analyzer" "strip-arglist-meta") (jolt-first rest-items)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-vec?") first*)) (jolt-invoke (var-deref "jolt.ir" "fn-node") fn-name (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze-arity") ctx first* (jolt-rest rest-items) env fn-name))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") first*)) (jolt-invoke (var-deref "jolt.ir" "fn-node") fn-name (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (clause) (let fnrec8628 ((clause clause)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") clause)))) (let* ((_a$8629 (var-deref "jolt.analyzer" "analyze-arity")) (_a$8630 ctx) (_a$8631 (jolt-invoke (var-deref "jolt.analyzer" "strip-arglist-meta") (jolt-first cl))) (_a$8632 (jolt-rest cl)) (_a$8633 env) (_a$8634 fn-name)) (jolt-invoke _a$8629 _a$8630 _a$8631 _a$8632 _a$8633 _a$8634))))) rest-items)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "fn: bad params") jolt-nil)))))))) analyze-fn) (let* ((_o$8635 (keyword #f "private")) (_o$8636 #t)) (jolt-hash-map _o$8635 _o$8636)))) + (def-var-with-meta! "jolt.analyzer" "strip-arglist-meta" (letrec ((strip-arglist-meta (lambda (form) (let fnrec8631 ((form form)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") form)) (let* ((es (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") form)))) (if (jolt-truthy? (let* ((and__25__auto (jolt= 3 (jolt-count es)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first es)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "with-meta" (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first es))))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-vec?") (jolt-nth es 1)) and__25__auto)) and__25__auto)) and__25__auto))) (jolt-nth es 1) form)) form))))) strip-arglist-meta) (let* ((_o$8632 (keyword #f "private")) (_o$8633 #t)) (jolt-hash-map _o$8632 _o$8633)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "catch-all-names" (let* ((_o$8637 "Throwable") (_o$8638 "java.lang.Throwable") (_o$8639 "Object") (_o$8640 "java.lang.Object")) (jolt-hash-set _o$8637 _o$8638 _o$8639 _o$8640)) (let* ((_o$8641 (keyword #f "private")) (_o$8642 #t)) (jolt-hash-map _o$8641 _o$8642)))) + (def-var-with-meta! "jolt.analyzer" "analyze-fn" (letrec ((analyze-fn (lambda (ctx items env) (let fnrec8634 ((ctx ctx) (items items) (env env)) (let* ((named (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1))) (fn-name (if (jolt-truthy? named) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1)) jolt-nil)) (rest-items (if (jolt-truthy? named) (jolt-drop 2 items) (jolt-drop 1 items))) (first* (jolt-invoke (var-deref "jolt.analyzer" "strip-arglist-meta") (jolt-first rest-items)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-vec?") first*)) (jolt-invoke (var-deref "jolt.ir" "fn-node") fn-name (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze-arity") ctx first* (jolt-rest rest-items) env fn-name))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") first*)) (jolt-invoke (var-deref "jolt.ir" "fn-node") fn-name (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (clause) (let fnrec8635 ((clause clause)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") clause)))) (let* ((_a$8636 (var-deref "jolt.analyzer" "analyze-arity")) (_a$8637 ctx) (_a$8638 (jolt-invoke (var-deref "jolt.analyzer" "strip-arglist-meta") (jolt-first cl))) (_a$8639 (jolt-rest cl)) (_a$8640 env) (_a$8641 fn-name)) (jolt-invoke _a$8636 _a$8637 _a$8638 _a$8639 _a$8640 _a$8641))))) rest-items)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "fn: bad params") jolt-nil)))))))) analyze-fn) (let* ((_o$8642 (keyword #f "private")) (_o$8643 #t)) (jolt-hash-map _o$8642 _o$8643)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-try" (letrec ((analyze-try (lambda (ctx items env) (let fnrec8643 ((ctx ctx) (items items) (env env)) (let* ((clauses (jolt-rest items)) (body (jolt-invoke (var-deref "clojure.core" "atom") (jolt-vector))) (catches (jolt-invoke (var-deref "clojure.core" "atom") (jolt-vector))) (finally-body (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil))) (begin (begin (jolt-count (jolt-map (lambda (c) (let fnrec8644 ((c c)) (begin (let* ((head (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") c)) (jolt-first (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") c))) jolt-nil)) (hname (if (jolt-truthy? (let* ((and__25__auto head)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") head) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil))) (if (jolt= hname "catch") (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") c)))) (begin (if (let* ((or__26__auto (< (jolt-count cl) 3))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth cl 2))))) (jolt-throw "Unable to parse catch clause; expected (catch class binding body*)") jolt-nil) (jolt-invoke (var-deref "clojure.core" "swap!") catches jolt-conj cl))) (if (jolt= hname "finally") (jolt-invoke (var-deref "clojure.core" "reset!") finally-body (jolt-rest (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") c)))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "clojure.core" "swap!") body jolt-conj c) jolt-nil)))) jolt-nil))) clauses)) jolt-nil) (let* ((n (let* ((_o$8645 (keyword #f "op")) (_o$8646 (keyword #f "try")) (_o$8647 (keyword #f "body")) (_o$8648 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") body) env))) (jolt-hash-map _o$8645 _o$8646 _o$8647 _o$8648))) (n (if (jolt-truthy? (jolt-seq (jolt-invoke (var-deref "clojure.core" "deref") catches))) (let* ((evar-name (jolt-invoke (var-deref "jolt.analyzer" "gen-name") "catch")) (evar (jolt-invoke (var-deref "clojure.core" "symbol") evar-name)) (dispatch (let* ((_a$8653 (lambda (_else cl) (let fnrec8649 ((_else _else) (cl cl)) (let* ((cform (jolt-nth cl 1)) (bindsym (jolt-nth cl 2)) (bodyf (jolt-drop 3 cl)) (letform (jolt-cons (jolt-symbol #f "let") (jolt-cons (jolt-vector bindsym evar) bodyf))) (fullname (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") cform)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") cform) jolt-nil)) (catch-all? (let* ((or__26__auto (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") cform)))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-contains? (var-deref "jolt.analyzer" "catch-all-names") fullname))))) (if (jolt-truthy? catch-all?) letform (jolt-list (jolt-symbol #f "if") (let* ((_a$8650 (jolt-symbol #f "or")) (_a$8651 (jolt-list (jolt-symbol #f "instance?") cform evar)) (_a$8652 (jolt-list (jolt-symbol #f "__catch-broad?") fullname evar))) (jolt-list _a$8650 _a$8651 _a$8652)) letform _else)))))) (_a$8654 (jolt-list (jolt-symbol #f "throw") evar)) (_a$8655 (jolt-reverse (jolt-invoke (var-deref "clojure.core" "deref") catches)))) (jolt-reduce _a$8653 _a$8654 _a$8655)))) (jolt-assoc n (keyword #f "catch-sym") evar-name (keyword #f "catch-body") (let* ((_a$8656 (var-deref "jolt.analyzer" "analyze-seq")) (_a$8657 ctx) (_a$8658 (jolt-list dispatch)) (_a$8659 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector evar-name)))) (jolt-invoke _a$8656 _a$8657 _a$8658 _a$8659)))) n)) (n (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "deref") finally-body)) (jolt-assoc n (keyword #f "finally") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") finally-body) env)) n))) n))))))) analyze-try) (let* ((_o$8660 (keyword #f "private")) (_o$8661 #t)) (jolt-hash-map _o$8660 _o$8661)))) + (def-var-with-meta! "jolt.analyzer" "catch-all-names" (let* ((_o$8644 "Throwable") (_o$8645 "java.lang.Throwable") (_o$8646 "Object") (_o$8647 "java.lang.Object")) (jolt-hash-set _o$8644 _o$8645 _o$8646 _o$8647)) (let* ((_o$8648 (keyword #f "private")) (_o$8649 #t)) (jolt-hash-map _o$8648 _o$8649)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-letfn" (letrec ((analyze-letfn (lambda (ctx items env) (let fnrec8662 ((ctx ctx) (items items) (env env)) (let* ((specs (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1)))) (names (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__92_) (let fnrec8663 ((p__92_ p__92_)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") p__92_)))))) specs)) (env* (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names)) (binds (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (spec) (let fnrec8664 ((spec spec)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") spec)))) (let* ((_o$8665 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first cl))) (_o$8666 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-cons (jolt-invoke (var-deref "clojure.core" "symbol") "fn") cl) env*))) (jolt-vector _o$8665 _o$8666))))) specs))) (let* ((_o$8667 (keyword #f "op")) (_o$8668 (keyword #f "let")) (_o$8669 (keyword #f "letrec")) (_o$8670 #t) (_o$8671 (keyword #f "bindings")) (_o$8672 binds) (_o$8673 (keyword #f "body")) (_o$8674 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env*))) (jolt-hash-map _o$8667 _o$8668 _o$8669 _o$8670 _o$8671 _o$8672 _o$8673 _o$8674))))))) analyze-letfn) (let* ((_o$8675 (keyword #f "private")) (_o$8676 #t)) (jolt-hash-map _o$8675 _o$8676)))) + (def-var-with-meta! "jolt.analyzer" "analyze-try" (letrec ((analyze-try (lambda (ctx items env) (let fnrec8650 ((ctx ctx) (items items) (env env)) (let* ((clauses (jolt-rest items)) (body (jolt-invoke (var-deref "clojure.core" "atom") (jolt-vector))) (catches (jolt-invoke (var-deref "clojure.core" "atom") (jolt-vector))) (finally-body (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil))) (begin (begin (jolt-count (jolt-map (lambda (c) (let fnrec8651 ((c c)) (begin (let* ((head (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") c)) (jolt-first (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") c))) jolt-nil)) (hname (if (jolt-truthy? (let* ((and__25__auto head)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") head) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil))) (if (jolt= hname "catch") (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") c)))) (begin (if (let* ((or__26__auto (< (jolt-count cl) 3))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth cl 2))))) (jolt-throw "Unable to parse catch clause; expected (catch class binding body*)") jolt-nil) (jolt-invoke (var-deref "clojure.core" "swap!") catches jolt-conj cl))) (if (jolt= hname "finally") (jolt-invoke (var-deref "clojure.core" "reset!") finally-body (jolt-rest (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") c)))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "clojure.core" "swap!") body jolt-conj c) jolt-nil)))) jolt-nil))) clauses)) jolt-nil) (let* ((n (let* ((_o$8652 (keyword #f "op")) (_o$8653 (keyword #f "try")) (_o$8654 (keyword #f "body")) (_o$8655 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") body) env))) (jolt-hash-map _o$8652 _o$8653 _o$8654 _o$8655))) (n (if (jolt-truthy? (jolt-seq (jolt-invoke (var-deref "clojure.core" "deref") catches))) (let* ((evar-name (jolt-invoke (var-deref "jolt.analyzer" "gen-name") "catch")) (evar (jolt-invoke (var-deref "clojure.core" "symbol") evar-name)) (dispatch (let* ((_a$8660 (lambda (_else cl) (let fnrec8656 ((_else _else) (cl cl)) (let* ((cform (jolt-nth cl 1)) (bindsym (jolt-nth cl 2)) (bodyf (jolt-drop 3 cl)) (letform (jolt-cons (jolt-symbol #f "let") (jolt-cons (jolt-vector bindsym evar) bodyf))) (fullname (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") cform)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") cform) jolt-nil)) (catch-all? (let* ((or__26__auto (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") cform)))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-contains? (var-deref "jolt.analyzer" "catch-all-names") fullname))))) (if (jolt-truthy? catch-all?) letform (jolt-list (jolt-symbol #f "if") (let* ((_a$8657 (jolt-symbol #f "or")) (_a$8658 (jolt-list (jolt-symbol #f "instance?") cform evar)) (_a$8659 (jolt-list (jolt-symbol #f "__catch-broad?") fullname evar))) (jolt-list _a$8657 _a$8658 _a$8659)) letform _else)))))) (_a$8661 (jolt-list (jolt-symbol #f "throw") evar)) (_a$8662 (jolt-reverse (jolt-invoke (var-deref "clojure.core" "deref") catches)))) (jolt-reduce _a$8660 _a$8661 _a$8662)))) (jolt-assoc n (keyword #f "catch-sym") evar-name (keyword #f "catch-body") (let* ((_a$8663 (var-deref "jolt.analyzer" "analyze-seq")) (_a$8664 ctx) (_a$8665 (jolt-list dispatch)) (_a$8666 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector evar-name)))) (jolt-invoke _a$8663 _a$8664 _a$8665 _a$8666)))) n)) (n (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "deref") finally-body)) (jolt-assoc n (keyword #f "finally") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") finally-body) env)) n))) n))))))) analyze-try) (let* ((_o$8667 (keyword #f "private")) (_o$8668 #t)) (jolt-hash-map _o$8667 _o$8668)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec8677 ((nm nm)) (let* ((and__25__auto (> (jolt-count nm) 2))) (if (jolt-truthy? and__25__auto) (jolt= ".-" (jolt-invoke (var-deref "clojure.core" "subs") nm 0 2)) and__25__auto)))))) field-head?) (let* ((_o$8678 (keyword #f "private")) (_o$8679 #t)) (jolt-hash-map _o$8678 _o$8679)))) + (def-var-with-meta! "jolt.analyzer" "analyze-letfn" (letrec ((analyze-letfn (lambda (ctx items env) (let fnrec8669 ((ctx ctx) (items items) (env env)) (let* ((specs (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1)))) (names (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__92_) (let fnrec8670 ((p__92_ p__92_)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") p__92_)))))) specs)) (env* (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names)) (binds (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (spec) (let fnrec8671 ((spec spec)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") spec)))) (let* ((_o$8672 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first cl))) (_o$8673 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-cons (jolt-invoke (var-deref "clojure.core" "symbol") "fn") cl) env*))) (jolt-vector _o$8672 _o$8673))))) specs))) (let* ((_o$8674 (keyword #f "op")) (_o$8675 (keyword #f "let")) (_o$8676 (keyword #f "letrec")) (_o$8677 #t) (_o$8678 (keyword #f "bindings")) (_o$8679 binds) (_o$8680 (keyword #f "body")) (_o$8681 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env*))) (jolt-hash-map _o$8674 _o$8675 _o$8676 _o$8677 _o$8678 _o$8679 _o$8680 _o$8681))))))) analyze-letfn) (let* ((_o$8682 (keyword #f "private")) (_o$8683 #t)) (jolt-hash-map _o$8682 _o$8683)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "def-meta-expr" (letrec ((def-meta-expr (lambda (ctx base env) (let fnrec8680 ((ctx ctx) (base base) (env env)) (if (jolt-pos? (jolt-count base)) (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$8684 (var-deref "clojure.core" "mapv")) (_a$8685 (lambda (p) (let fnrec8681 ((p p)) (let* ((k (jolt-first p)) (v (jolt-invoke (var-deref "clojure.core" "second") p))) (let* ((_o$8682 (jolt-invoke (var-deref "jolt.ir" "const") k)) (_o$8683 (if (jolt= k (keyword #f "tag")) (jolt-invoke (var-deref "jolt.ir" "quote-node") v) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx v env)))) (jolt-vector _o$8682 _o$8683)))))) (_a$8686 (jolt-seq base))) (jolt-invoke _a$8684 _a$8685 _a$8686))) jolt-nil))))) def-meta-expr) (let* ((_o$8687 (keyword #f "private")) (_o$8688 #t)) (jolt-hash-map _o$8687 _o$8688)))) + (def-var-with-meta! "jolt.analyzer" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec8684 ((nm nm)) (let* ((and__25__auto (> (jolt-count nm) 2))) (if (jolt-truthy? and__25__auto) (jolt= ".-" (jolt-invoke (var-deref "clojure.core" "subs") nm 0 2)) and__25__auto)))))) field-head?) (let* ((_o$8685 (keyword #f "private")) (_o$8686 #t)) (jolt-hash-map _o$8685 _o$8686)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-def" (letrec ((analyze-def (lambda (ctx items env) (let fnrec8689 ((ctx ctx) (items items) (env env)) (let* ((name-sym (jolt-nth items 1))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") name-sym)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "def name with map metadata") jolt-nil) (if (< (jolt-count items) 3) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") name-sym)) (cur (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (let* ((_o$8690 (keyword #f "op")) (_o$8691 (keyword #f "def")) (_o$8692 (keyword #f "ns")) (_o$8693 cur) (_o$8694 (keyword #f "name")) (_o$8695 nm) (_o$8696 (keyword #f "no-init")) (_o$8697 #t)) (jolt-hash-map _o$8690 _o$8691 _o$8692 _o$8693 _o$8694 _o$8695 _o$8696 _o$8697)))) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") name-sym)) (cur (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (has-doc (let* ((and__25__auto (> (jolt-count items) 3))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "clojure.core" "string?") (jolt-nth items 2)) and__25__auto))) (val-form (jolt-nth items (if (jolt-truthy? has-doc) 3 2))) (base0 (let* ((or__26__auto (jolt-invoke (var-deref "jolt.host" "form-sym-meta") name-sym))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-hash-map)))) (tag (jolt-get base0 (keyword #f "tag"))) (tag-name (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") tag)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") tag) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") tag)) tag (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))) (base-meta (if (jolt-truthy? tag-name) (let* ((c (jolt-invoke (var-deref "jolt.host" "resolve-class-hint") tag-name))) (if (jolt-truthy? c) (jolt-assoc base0 (keyword #f "tag") c) base0)) base0)) (node-meta (if (jolt-truthy? has-doc) (jolt-assoc base-meta (keyword #f "doc") (jolt-nth items 2)) base-meta))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (let* ((node (jolt-invoke (var-deref "jolt.ir" "def-node") cur nm (let* ((_a$8698 (var-deref "jolt.analyzer" "with-ret-nhint")) (_a$8699 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env)) (_a$8700 (jolt-invoke (var-deref "jolt.analyzer" "tag->nkind") tag))) (jolt-invoke _a$8698 _a$8699 _a$8700)) node-meta)) (me (jolt-invoke (var-deref "jolt.analyzer" "def-meta-expr") ctx node-meta env))) (if (jolt-truthy? me) (jolt-assoc node (keyword #f "meta-expr") me) node))))))))))) analyze-def) (let* ((_o$8701 (keyword #f "private")) (_o$8702 #t)) (jolt-hash-map _o$8701 _o$8702)))) + (def-var-with-meta! "jolt.analyzer" "def-meta-expr" (letrec ((def-meta-expr (lambda (ctx base env) (let fnrec8687 ((ctx ctx) (base base) (env env)) (if (jolt-pos? (jolt-count base)) (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$8691 (var-deref "clojure.core" "mapv")) (_a$8692 (lambda (p) (let fnrec8688 ((p p)) (let* ((k (jolt-first p)) (v (jolt-invoke (var-deref "clojure.core" "second") p))) (let* ((_o$8689 (jolt-invoke (var-deref "jolt.ir" "const") k)) (_o$8690 (if (jolt= k (keyword #f "tag")) (jolt-invoke (var-deref "jolt.ir" "quote-node") v) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx v env)))) (jolt-vector _o$8689 _o$8690)))))) (_a$8693 (jolt-seq base))) (jolt-invoke _a$8691 _a$8692 _a$8693))) jolt-nil))))) def-meta-expr) (let* ((_o$8694 (keyword #f "private")) (_o$8695 #t)) (jolt-hash-map _o$8694 _o$8695)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-set!" (letrec ((analyze-set! (lambda (ctx items env) (let fnrec8703 ((ctx ctx) (items items) (env env)) (let* ((target (jolt-nth items 1)) (val-node (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (ti (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") target)) (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") target)) jolt-nil)) (thead (if (jolt-truthy? (let* ((and__25__auto ti)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-pos? (jolt-count ti)))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first ti)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first ti)) jolt-nil))) (if (jolt-truthy? (let* ((and__25__auto thead)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") thead) and__25__auto))) (let* ((_o$8704 (keyword #f "op")) (_o$8705 (keyword #f "set-field")) (_o$8706 (keyword #f "obj")) (_o$8707 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth ti 1) env)) (_o$8708 (keyword #f "field")) (_o$8709 (jolt-invoke (var-deref "clojure.core" "subs") thead 2)) (_o$8710 (keyword #f "val")) (_o$8711 val-node)) (jolt-hash-map _o$8704 _o$8705 _o$8706 _o$8707 _o$8708 _o$8709 _o$8710 _o$8711)) (if (jolt-truthy? (let* ((and__25__auto (jolt= thead "."))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (>= (jolt-count ti) 3))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth ti 1)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth ti 2)))) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "class") (jolt-get (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx (jolt-nth ti 1)) (keyword #f "kind"))) and__25__auto)) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((_a$8715 (var-deref "jolt.ir" "invoke")) (_a$8716 (jolt-invoke (var-deref "jolt.ir" "var-ref") "jolt.host" "set-static-field!")) (_a$8717 (let* ((_o$8712 (jolt-invoke (var-deref "jolt.ir" "const") (jolt-get (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx (jolt-nth ti 1)) (keyword #f "name")))) (_o$8713 (jolt-invoke (var-deref "jolt.ir" "const") (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth ti 2)))) (_o$8714 val-node)) (jolt-vector _o$8712 _o$8713 _o$8714)))) (jolt-invoke _a$8715 _a$8716 _a$8717)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") target)) (begin (if (jolt-truthy? (jolt-invoke (var-deref "jolt.analyzer" "local?") env (jolt-invoke (var-deref "jolt.host" "form-sym-name") target))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of a local") jolt-nil) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx target))) (begin (if (jolt-not (jolt= (keyword #f "var") (jolt-get r (keyword #f "kind")))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of a non-var") jolt-nil) (let* ((_o$8721 (keyword #f "op")) (_o$8722 (keyword #f "set-var")) (_o$8723 (keyword #f "the-var")) (_o$8724 (let* ((_a$8718 (var-deref "jolt.ir" "the-var")) (_a$8719 (jolt-get r (keyword #f "ns"))) (_a$8720 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8718 _a$8719 _a$8720))) (_o$8725 (keyword #f "val")) (_o$8726 val-node)) (jolt-hash-map _o$8721 _o$8722 _o$8723 _o$8724 _o$8725 _o$8726))))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of an unsupported target") jolt-nil))))))))) analyze-set!) (let* ((_o$8727 (keyword #f "private")) (_o$8728 #t)) (jolt-hash-map _o$8727 _o$8728)))) + (def-var-with-meta! "jolt.analyzer" "analyze-def" (letrec ((analyze-def (lambda (ctx items env) (let fnrec8696 ((ctx ctx) (items items) (env env)) (let* ((name-sym (jolt-nth items 1))) (begin (if (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") name-sym)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "def name with map metadata") jolt-nil) (if (< (jolt-count items) 3) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") name-sym)) (cur (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (let* ((_o$8697 (keyword #f "op")) (_o$8698 (keyword #f "def")) (_o$8699 (keyword #f "ns")) (_o$8700 cur) (_o$8701 (keyword #f "name")) (_o$8702 nm) (_o$8703 (keyword #f "no-init")) (_o$8704 #t)) (jolt-hash-map _o$8697 _o$8698 _o$8699 _o$8700 _o$8701 _o$8702 _o$8703 _o$8704)))) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") name-sym)) (cur (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (has-doc (let* ((and__25__auto (> (jolt-count items) 3))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "clojure.core" "string?") (jolt-nth items 2)) and__25__auto))) (val-form (jolt-nth items (if (jolt-truthy? has-doc) 3 2))) (base0 (let* ((or__26__auto (jolt-invoke (var-deref "jolt.host" "form-sym-meta") name-sym))) (if (jolt-truthy? or__26__auto) or__26__auto (jolt-hash-map)))) (tag (jolt-get base0 (keyword #f "tag"))) (tag-name (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") tag)) (jolt-invoke (var-deref "jolt.host" "form-sym-name") tag) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") tag)) tag (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))) (base-meta (if (jolt-truthy? tag-name) (let* ((c (jolt-invoke (var-deref "jolt.host" "resolve-class-hint") tag-name))) (if (jolt-truthy? c) (jolt-assoc base0 (keyword #f "tag") c) base0)) base0)) (node-meta (if (jolt-truthy? has-doc) (jolt-assoc base-meta (keyword #f "doc") (jolt-nth items 2)) base-meta))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (let* ((node (jolt-invoke (var-deref "jolt.ir" "def-node") cur nm (let* ((_a$8705 (var-deref "jolt.analyzer" "with-ret-nhint")) (_a$8706 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env)) (_a$8707 (jolt-invoke (var-deref "jolt.analyzer" "tag->nkind") tag))) (jolt-invoke _a$8705 _a$8706 _a$8707)) node-meta)) (me (jolt-invoke (var-deref "jolt.analyzer" "def-meta-expr") ctx node-meta env))) (if (jolt-truthy? me) (jolt-assoc node (keyword #f "meta-expr") me) node))))))))))) analyze-def) (let* ((_o$8708 (keyword #f "private")) (_o$8709 #t)) (jolt-hash-map _o$8708 _o$8709)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec8729 ((ctx ctx) (op op) (items items) (env env)) (let* ((G__149 op)) (if (jolt= G__149 "quote") (jolt-invoke (var-deref "jolt.ir" "quote-node") (jolt-invoke (var-deref "clojure.core" "second") items)) (if (jolt= G__149 "if") (begin (if (let* ((or__26__auto (< (jolt-count items) 3))) (if (jolt-truthy? or__26__auto) or__26__auto (> (jolt-count items) 4))) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Wrong number of args (" (jolt-dec (jolt-count items)) ") passed to: if")) jolt-nil) (let* ((_a$8730 (var-deref "jolt.ir" "if-node")) (_a$8731 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_a$8732 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (_a$8733 (if (> (jolt-count items) 3) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 3) env) (jolt-invoke (var-deref "jolt.ir" "const") jolt-nil)))) (jolt-invoke _a$8730 _a$8731 _a$8732 _a$8733))) (if (jolt= G__149 "do") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-rest items) env) (if (jolt= G__149 "throw") (jolt-invoke (var-deref "jolt.ir" "throw-node") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (if (jolt= G__149 "def") (jolt-invoke (var-deref "jolt.analyzer" "analyze-def") ctx items env) (if (jolt= G__149 "let*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1)))) (r (jolt-invoke (var-deref "jolt.analyzer" "analyze-bindings") ctx bvec env))) (let* ((_a$8738 (var-deref "jolt.ir" "let-node")) (_a$8739 (jolt-first r)) (_a$8740 (let* ((_a$8734 (var-deref "jolt.analyzer" "analyze-seq")) (_a$8735 ctx) (_a$8736 (jolt-drop 2 items)) (_a$8737 (jolt-invoke (var-deref "clojure.core" "second") r))) (jolt-invoke _a$8734 _a$8735 _a$8736 _a$8737)))) (jolt-invoke _a$8738 _a$8739 _a$8740))) (if (jolt= G__149 "loop*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1)))) (rname (jolt-invoke (var-deref "jolt.analyzer" "gen-name") "loop")) (r (jolt-invoke (var-deref "jolt.analyzer" "analyze-bindings") ctx bvec env)) (env** (jolt-invoke (var-deref "jolt.analyzer" "with-recur") (jolt-invoke (var-deref "clojure.core" "second") r) rname))) (let* ((_o$8741 (keyword #f "op")) (_o$8742 (keyword #f "loop")) (_o$8743 (keyword #f "recur-name")) (_o$8744 rname) (_o$8745 (keyword #f "bindings")) (_o$8746 (jolt-first r)) (_o$8747 (keyword #f "body")) (_o$8748 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env**))) (jolt-hash-map _o$8741 _o$8742 _o$8743 _o$8744 _o$8745 _o$8746 _o$8747 _o$8748))) (if (jolt= G__149 "recur") (let* ((rt (jolt-get env (keyword #f "recur")))) (begin (if (jolt-not rt) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "recur outside loop/fn") jolt-nil) (let* ((_o$8753 (keyword #f "op")) (_o$8754 (keyword #f "recur")) (_o$8755 (keyword #f "recur-name")) (_o$8756 rt) (_o$8757 (keyword #f "args")) (_o$8758 (let* ((_a$8750 (var-deref "clojure.core" "mapv")) (_a$8751 (lambda (p__93_) (let fnrec8749 ((p__93_ p__93_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__93_ env)))) (_a$8752 (jolt-rest items))) (jolt-invoke _a$8750 _a$8751 _a$8752)))) (jolt-hash-map _o$8753 _o$8754 _o$8755 _o$8756 _o$8757 _o$8758)))) (if (jolt= G__149 "try") (jolt-invoke (var-deref "jolt.analyzer" "analyze-try") ctx items env) (if (jolt= G__149 "letfn") (jolt-invoke (var-deref "jolt.analyzer" "analyze-letfn") ctx items env) (if (jolt= G__149 "fn*") (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx items env) (if (jolt= G__149 "syntax-quote") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-invoke (var-deref "jolt.host" "form-syntax-quote-lower") ctx (jolt-invoke (var-deref "clojure.core" "second") items)) env) (if (jolt= G__149 "var") (let* ((sym (jolt-invoke (var-deref "clojure.core" "second") items)) (r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx sym))) (if (jolt= (keyword #f "var") (jolt-get r (keyword #f "kind"))) (let* ((_a$8759 (var-deref "jolt.ir" "the-var")) (_a$8760 (jolt-get r (keyword #f "ns"))) (_a$8761 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8759 _a$8760 _a$8761)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "var of non-var " (jolt-invoke (var-deref "jolt.host" "form-sym-name") sym))))) (if (jolt= G__149 "defmacro") (let* ((name-sym (jolt-nth items 1)) (nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") name-sym)) (cur (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (after (jolt-drop 2 items)) (after (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") (jolt-first after))) (jolt-rest after) after)) (after (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") (jolt-first after))) (jolt-rest after) after)) (fn-form (jolt-cons (jolt-invoke (var-deref "clojure.core" "symbol") "fn") after))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (let* ((_o$8762 (keyword #f "op")) (_o$8763 (keyword #f "defmacro")) (_o$8764 (keyword #f "ns")) (_o$8765 cur) (_o$8766 (keyword #f "name")) (_o$8767 nm) (_o$8768 (keyword #f "fn")) (_o$8769 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx fn-form env))) (jolt-hash-map _o$8762 _o$8763 _o$8764 _o$8765 _o$8766 _o$8767 _o$8768 _o$8769)))) (if (jolt= G__149 "set!") (jolt-invoke (var-deref "jolt.analyzer" "analyze-set!") ctx items env) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "special form " op)))))))))))))))))))))) analyze-special) (let* ((_o$8770 (keyword #f "private")) (_o$8771 #t)) (jolt-hash-map _o$8770 _o$8771)))) + (def-var-with-meta! "jolt.analyzer" "analyze-set!" (letrec ((analyze-set! (lambda (ctx items env) (let fnrec8710 ((ctx ctx) (items items) (env env)) (let* ((target (jolt-nth items 1)) (val-node (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (ti (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") target)) (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") target)) jolt-nil)) (thead (if (jolt-truthy? (let* ((and__25__auto ti)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-pos? (jolt-count ti)))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first ti)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first ti)) jolt-nil))) (if (jolt-truthy? (let* ((and__25__auto thead)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") thead) and__25__auto))) (let* ((_o$8711 (keyword #f "op")) (_o$8712 (keyword #f "set-field")) (_o$8713 (keyword #f "obj")) (_o$8714 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth ti 1) env)) (_o$8715 (keyword #f "field")) (_o$8716 (jolt-invoke (var-deref "clojure.core" "subs") thead 2)) (_o$8717 (keyword #f "val")) (_o$8718 val-node)) (jolt-hash-map _o$8711 _o$8712 _o$8713 _o$8714 _o$8715 _o$8716 _o$8717 _o$8718)) (if (jolt-truthy? (let* ((and__25__auto (jolt= thead "."))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (>= (jolt-count ti) 3))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth ti 1)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth ti 2)))) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "class") (jolt-get (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx (jolt-nth ti 1)) (keyword #f "kind"))) and__25__auto)) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((_a$8722 (var-deref "jolt.ir" "invoke")) (_a$8723 (jolt-invoke (var-deref "jolt.ir" "var-ref") "jolt.host" "set-static-field!")) (_a$8724 (let* ((_o$8719 (jolt-invoke (var-deref "jolt.ir" "const") (jolt-get (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx (jolt-nth ti 1)) (keyword #f "name")))) (_o$8720 (jolt-invoke (var-deref "jolt.ir" "const") (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth ti 2)))) (_o$8721 val-node)) (jolt-vector _o$8719 _o$8720 _o$8721)))) (jolt-invoke _a$8722 _a$8723 _a$8724)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") target)) (begin (if (jolt-truthy? (jolt-invoke (var-deref "jolt.analyzer" "local?") env (jolt-invoke (var-deref "jolt.host" "form-sym-name") target))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of a local") jolt-nil) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx target))) (begin (if (jolt-not (jolt= (keyword #f "var") (jolt-get r (keyword #f "kind")))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of a non-var") jolt-nil) (let* ((_o$8728 (keyword #f "op")) (_o$8729 (keyword #f "set-var")) (_o$8730 (keyword #f "the-var")) (_o$8731 (let* ((_a$8725 (var-deref "jolt.ir" "the-var")) (_a$8726 (jolt-get r (keyword #f "ns"))) (_a$8727 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8725 _a$8726 _a$8727))) (_o$8732 (keyword #f "val")) (_o$8733 val-node)) (jolt-hash-map _o$8728 _o$8729 _o$8730 _o$8731 _o$8732 _o$8733))))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of an unsupported target") jolt-nil))))))))) analyze-set!) (let* ((_o$8734 (keyword #f "private")) (_o$8735 #t)) (jolt-hash-map _o$8734 _o$8735)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec8772 ((nm nm)) (let* ((and__25__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not (jolt= "-" (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))))) (if (jolt-truthy? and__25__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))) and__25__auto)) and__25__auto)) and__25__auto)))))) method-head?) (let* ((_o$8773 (keyword #f "private")) (_o$8774 #t)) (jolt-hash-map _o$8773 _o$8774)))) + (def-var-with-meta! "jolt.analyzer" "analyze-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec8736 ((ctx ctx) (op op) (items items) (env env)) (let* ((G__149 op)) (if (jolt= G__149 "quote") (jolt-invoke (var-deref "jolt.ir" "quote-node") (jolt-invoke (var-deref "clojure.core" "second") items)) (if (jolt= G__149 "if") (begin (if (let* ((or__26__auto (< (jolt-count items) 3))) (if (jolt-truthy? or__26__auto) or__26__auto (> (jolt-count items) 4))) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Wrong number of args (" (jolt-dec (jolt-count items)) ") passed to: if")) jolt-nil) (let* ((_a$8737 (var-deref "jolt.ir" "if-node")) (_a$8738 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_a$8739 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (_a$8740 (if (> (jolt-count items) 3) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 3) env) (jolt-invoke (var-deref "jolt.ir" "const") jolt-nil)))) (jolt-invoke _a$8737 _a$8738 _a$8739 _a$8740))) (if (jolt= G__149 "do") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-rest items) env) (if (jolt= G__149 "throw") (jolt-invoke (var-deref "jolt.ir" "throw-node") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (if (jolt= G__149 "def") (jolt-invoke (var-deref "jolt.analyzer" "analyze-def") ctx items env) (if (jolt= G__149 "let*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1)))) (r (jolt-invoke (var-deref "jolt.analyzer" "analyze-bindings") ctx bvec env))) (let* ((_a$8745 (var-deref "jolt.ir" "let-node")) (_a$8746 (jolt-first r)) (_a$8747 (let* ((_a$8741 (var-deref "jolt.analyzer" "analyze-seq")) (_a$8742 ctx) (_a$8743 (jolt-drop 2 items)) (_a$8744 (jolt-invoke (var-deref "clojure.core" "second") r))) (jolt-invoke _a$8741 _a$8742 _a$8743 _a$8744)))) (jolt-invoke _a$8745 _a$8746 _a$8747))) (if (jolt= G__149 "loop*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1)))) (rname (jolt-invoke (var-deref "jolt.analyzer" "gen-name") "loop")) (r (jolt-invoke (var-deref "jolt.analyzer" "analyze-bindings") ctx bvec env)) (env** (jolt-invoke (var-deref "jolt.analyzer" "with-recur") (jolt-invoke (var-deref "clojure.core" "second") r) rname))) (let* ((_o$8748 (keyword #f "op")) (_o$8749 (keyword #f "loop")) (_o$8750 (keyword #f "recur-name")) (_o$8751 rname) (_o$8752 (keyword #f "bindings")) (_o$8753 (jolt-first r)) (_o$8754 (keyword #f "body")) (_o$8755 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env**))) (jolt-hash-map _o$8748 _o$8749 _o$8750 _o$8751 _o$8752 _o$8753 _o$8754 _o$8755))) (if (jolt= G__149 "recur") (let* ((rt (jolt-get env (keyword #f "recur")))) (begin (if (jolt-not rt) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "recur outside loop/fn") jolt-nil) (let* ((_o$8760 (keyword #f "op")) (_o$8761 (keyword #f "recur")) (_o$8762 (keyword #f "recur-name")) (_o$8763 rt) (_o$8764 (keyword #f "args")) (_o$8765 (let* ((_a$8757 (var-deref "clojure.core" "mapv")) (_a$8758 (lambda (p__93_) (let fnrec8756 ((p__93_ p__93_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__93_ env)))) (_a$8759 (jolt-rest items))) (jolt-invoke _a$8757 _a$8758 _a$8759)))) (jolt-hash-map _o$8760 _o$8761 _o$8762 _o$8763 _o$8764 _o$8765)))) (if (jolt= G__149 "try") (jolt-invoke (var-deref "jolt.analyzer" "analyze-try") ctx items env) (if (jolt= G__149 "letfn") (jolt-invoke (var-deref "jolt.analyzer" "analyze-letfn") ctx items env) (if (jolt= G__149 "fn*") (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx items env) (if (jolt= G__149 "syntax-quote") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-invoke (var-deref "jolt.host" "form-syntax-quote-lower") ctx (jolt-invoke (var-deref "clojure.core" "second") items)) env) (if (jolt= G__149 "var") (let* ((sym (jolt-invoke (var-deref "clojure.core" "second") items)) (r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx sym))) (if (jolt= (keyword #f "var") (jolt-get r (keyword #f "kind"))) (let* ((_a$8766 (var-deref "jolt.ir" "the-var")) (_a$8767 (jolt-get r (keyword #f "ns"))) (_a$8768 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8766 _a$8767 _a$8768)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "var of non-var " (jolt-invoke (var-deref "jolt.host" "form-sym-name") sym))))) (if (jolt= G__149 "defmacro") (let* ((name-sym (jolt-nth items 1)) (nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") name-sym)) (cur (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (after (jolt-drop 2 items)) (after (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") (jolt-first after))) (jolt-rest after) after)) (after (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") (jolt-first after))) (jolt-rest after) after)) (fn-form (jolt-cons (jolt-invoke (var-deref "clojure.core" "symbol") "fn") after))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (let* ((_o$8769 (keyword #f "op")) (_o$8770 (keyword #f "defmacro")) (_o$8771 (keyword #f "ns")) (_o$8772 cur) (_o$8773 (keyword #f "name")) (_o$8774 nm) (_o$8775 (keyword #f "fn")) (_o$8776 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx fn-form env))) (jolt-hash-map _o$8769 _o$8770 _o$8771 _o$8772 _o$8773 _o$8774 _o$8775 _o$8776)))) (if (jolt= G__149 "set!") (jolt-invoke (var-deref "jolt.analyzer" "analyze-set!") ctx items env) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "special form " op)))))))))))))))))))))) analyze-special) (let* ((_o$8777 (keyword #f "private")) (_o$8778 #t)) (jolt-hash-map _o$8777 _o$8778)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec8775 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed member expression, expecting (.method target ...): " hname)) jolt-nil) (let* ((_o$8780 (keyword #f "op")) (_o$8781 (keyword #f "host-call")) (_o$8782 (keyword #f "method")) (_o$8783 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$8784 (keyword #f "target")) (_o$8785 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$8786 (keyword #f "args")) (_o$8787 (let* ((_a$8777 (var-deref "clojure.core" "mapv")) (_a$8778 (lambda (p__94_) (let fnrec8776 ((p__94_ p__94_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__94_ env)))) (_a$8779 (jolt-drop 2 items))) (jolt-invoke _a$8777 _a$8778 _a$8779)))) (jolt-hash-map _o$8780 _o$8781 _o$8782 _o$8783 _o$8784 _o$8785 _o$8786 _o$8787))))))) analyze-host-call) (let* ((_o$8788 (keyword #f "private")) (_o$8789 #t)) (jolt-hash-map _o$8788 _o$8789)))) + (def-var-with-meta! "jolt.analyzer" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec8779 ((nm nm)) (let* ((and__25__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1)))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not (jolt= "-" (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))))) (if (jolt-truthy? and__25__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))) and__25__auto)) and__25__auto)) and__25__auto)))))) method-head?) (let* ((_o$8780 (keyword #f "private")) (_o$8781 #t)) (jolt-hash-map _o$8780 _o$8781)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec8790 ((nm nm)) (let* ((and__25__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "." (let* ((_a$8791 (var-deref "clojure.core" "subs")) (_a$8792 nm) (_a$8793 (jolt-dec (jolt-count nm))) (_a$8794 (jolt-count nm))) (jolt-invoke _a$8791 _a$8792 _a$8793 _a$8794))))) (if (jolt-truthy? and__25__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1))) and__25__auto)) and__25__auto)))))) ctor-head?) (let* ((_o$8795 (keyword #f "private")) (_o$8796 #t)) (jolt-hash-map _o$8795 _o$8796)))) + (def-var-with-meta! "jolt.analyzer" "analyze-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec8782 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed member expression, expecting (.method target ...): " hname)) jolt-nil) (let* ((_o$8787 (keyword #f "op")) (_o$8788 (keyword #f "host-call")) (_o$8789 (keyword #f "method")) (_o$8790 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$8791 (keyword #f "target")) (_o$8792 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$8793 (keyword #f "args")) (_o$8794 (let* ((_a$8784 (var-deref "clojure.core" "mapv")) (_a$8785 (lambda (p__94_) (let fnrec8783 ((p__94_ p__94_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__94_ env)))) (_a$8786 (jolt-drop 2 items))) (jolt-invoke _a$8784 _a$8785 _a$8786)))) (jolt-hash-map _o$8787 _o$8788 _o$8789 _o$8790 _o$8791 _o$8792 _o$8793 _o$8794))))))) analyze-host-call) (let* ((_o$8795 (keyword #f "private")) (_o$8796 #t)) (jolt-hash-map _o$8795 _o$8796)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec8797 ((ctx ctx) (class class) (args args) (env env)) (jolt-invoke (var-deref "jolt.ir" "host-new") class (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__95_) (let fnrec8798 ((p__95_ p__95_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__95_ env))) args)))))) analyze-ctor) (let* ((_o$8799 (keyword #f "private")) (_o$8800 #t)) (jolt-hash-map _o$8799 _o$8800)))) + (def-var-with-meta! "jolt.analyzer" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec8797 ((nm nm)) (let* ((and__25__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "." (let* ((_a$8798 (var-deref "clojure.core" "subs")) (_a$8799 nm) (_a$8800 (jolt-dec (jolt-count nm))) (_a$8801 (jolt-count nm))) (jolt-invoke _a$8798 _a$8799 _a$8800 _a$8801))))) (if (jolt-truthy? and__25__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1))) and__25__auto)) and__25__auto)))))) ctor-head?) (let* ((_o$8802 (keyword #f "private")) (_o$8803 #t)) (jolt-hash-map _o$8802 _o$8803)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-ffi-fn" (letrec ((analyze-ffi-fn (lambda (ctx items env) (let fnrec8801 ((ctx ctx) (items items) (env env)) (begin (if (jolt-not (<= 4 (jolt-count items) 5)) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "jolt.ffi/foreign-fn expects (foreign-fn \"sym\" [argtypes] rettype [:blocking])")) jolt-nil) (let* ((_o$8802 (keyword #f "op")) (_o$8803 (keyword #f "ffi-fn")) (_o$8804 (keyword #f "csym")) (_o$8805 (jolt-nth items 1)) (_o$8806 (keyword #f "argtypes")) (_o$8807 (jolt-invoke (var-deref "clojure.core" "mapv") (var-deref "clojure.core" "name") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 2)))) (_o$8808 (keyword #f "rettype")) (_o$8809 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$8810 (keyword #f "blocking")) (_o$8811 (let* ((and__25__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__25__auto) (jolt= "blocking" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__25__auto)))) (jolt-hash-map _o$8802 _o$8803 _o$8804 _o$8805 _o$8806 _o$8807 _o$8808 _o$8809 _o$8810 _o$8811))))))) analyze-ffi-fn) (let* ((_o$8812 (keyword #f "private")) (_o$8813 #t)) (jolt-hash-map _o$8812 _o$8813)))) + (def-var-with-meta! "jolt.analyzer" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec8804 ((ctx ctx) (class class) (args args) (env env)) (jolt-invoke (var-deref "jolt.ir" "host-new") class (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__95_) (let fnrec8805 ((p__95_ p__95_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__95_ env))) args)))))) analyze-ctor) (let* ((_o$8806 (keyword #f "private")) (_o$8807 #t)) (jolt-hash-map _o$8806 _o$8807)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-ffi-callable" (letrec ((analyze-ffi-callable (lambda (ctx items env) (let fnrec8814 ((ctx ctx) (items items) (env env)) (begin (if (jolt-not (<= 4 (jolt-count items) 5)) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "jolt.ffi/foreign-callable expects (foreign-callable f [argtypes] rettype [:collect-safe])")) jolt-nil) (let* ((_o$8815 (keyword #f "op")) (_o$8816 (keyword #f "ffi-callable")) (_o$8817 (keyword #f "fn")) (_o$8818 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$8819 (keyword #f "argtypes")) (_o$8820 (jolt-invoke (var-deref "clojure.core" "mapv") (var-deref "clojure.core" "name") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 2)))) (_o$8821 (keyword #f "rettype")) (_o$8822 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$8823 (keyword #f "collect-safe")) (_o$8824 (let* ((and__25__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__25__auto) (jolt= "collect-safe" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__25__auto)))) (jolt-hash-map _o$8815 _o$8816 _o$8817 _o$8818 _o$8819 _o$8820 _o$8821 _o$8822 _o$8823 _o$8824))))))) analyze-ffi-callable) (let* ((_o$8825 (keyword #f "private")) (_o$8826 #t)) (jolt-hash-map _o$8825 _o$8826)))) + (def-var-with-meta! "jolt.analyzer" "analyze-ffi-fn" (letrec ((analyze-ffi-fn (lambda (ctx items env) (let fnrec8808 ((ctx ctx) (items items) (env env)) (begin (if (jolt-not (<= 4 (jolt-count items) 5)) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "jolt.ffi/foreign-fn expects (foreign-fn \"sym\" [argtypes] rettype [:blocking])")) jolt-nil) (let* ((_o$8809 (keyword #f "op")) (_o$8810 (keyword #f "ffi-fn")) (_o$8811 (keyword #f "csym")) (_o$8812 (jolt-nth items 1)) (_o$8813 (keyword #f "argtypes")) (_o$8814 (jolt-invoke (var-deref "clojure.core" "mapv") (var-deref "clojure.core" "name") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 2)))) (_o$8815 (keyword #f "rettype")) (_o$8816 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$8817 (keyword #f "blocking")) (_o$8818 (let* ((and__25__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__25__auto) (jolt= "blocking" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__25__auto)))) (jolt-hash-map _o$8809 _o$8810 _o$8811 _o$8812 _o$8813 _o$8814 _o$8815 _o$8816 _o$8817 _o$8818))))))) analyze-ffi-fn) (let* ((_o$8819 (keyword #f "private")) (_o$8820 #t)) (jolt-hash-map _o$8819 _o$8820)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec8827 ((ctx ctx) (items items) (env env)) (begin (if (< (jolt-count items) 3) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (. target member ...) form")) jolt-nil) (let* ((member0 (jolt-nth items 2)) (items (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") member0)) (let* ((ml (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") member0)))) (let* ((_a$8831 (let* ((_o$8828 (jolt-nth items 0)) (_o$8829 (jolt-nth items 1)) (_o$8830 (jolt-first ml))) (jolt-vector _o$8828 _o$8829 _o$8830))) (_a$8832 (jolt-rest ml))) (jolt-into _a$8831 _a$8832))) items)) (target (jolt-nth items 1)) (member (jolt-nth items 2)) (class-target (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") target))) (if (jolt-truthy? and__25__auto) (jolt-not (jolt-invoke (var-deref "jolt.analyzer" "local?") env (jolt-invoke (var-deref "jolt.host" "form-sym-name") target))) and__25__auto))) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx target))) (if (jolt= (keyword #f "class") (jolt-get r (keyword #f "kind"))) (jolt-get r (keyword #f "name")) jolt-nil)) jolt-nil))) (if (jolt-truthy? (let* ((and__25__auto class-target)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") member) and__25__auto))) (let* ((_a$8837 (var-deref "jolt.ir" "invoke")) (_a$8838 (jolt-invoke (var-deref "jolt.ir" "host-static") class-target (jolt-invoke (var-deref "jolt.host" "form-sym-name") member))) (_a$8839 (let* ((_a$8834 (var-deref "clojure.core" "mapv")) (_a$8835 (lambda (p__96_) (let fnrec8833 ((p__96_ p__96_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__96_ env)))) (_a$8836 (jolt-drop 3 items))) (jolt-invoke _a$8834 _a$8835 _a$8836)))) (jolt-invoke _a$8837 _a$8838 _a$8839)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") member)) (let* ((_o$8844 (keyword #f "op")) (_o$8845 (keyword #f "host-call")) (_o$8846 (keyword #f "method")) (_o$8847 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$8848 (keyword #f "target")) (_o$8849 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx target env)) (_o$8850 (keyword #f "args")) (_o$8851 (let* ((_a$8841 (var-deref "clojure.core" "mapv")) (_a$8842 (lambda (p__97_) (let fnrec8840 ((p__97_ p__97_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__97_ env)))) (_a$8843 (jolt-drop 3 items))) (jolt-invoke _a$8841 _a$8842 _a$8843)))) (jolt-hash-map _o$8844 _o$8845 _o$8846 _o$8847 _o$8848 _o$8849 _o$8850 _o$8851)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-keyword?") member)) (let* ((_a$8852 (var-deref "jolt.ir" "invoke")) (_a$8853 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx member env)) (_a$8854 (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)))) (jolt-invoke _a$8852 _a$8853 _a$8854)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "special form . (non-symbol member)") jolt-nil)))))))))) analyze-dot) (let* ((_o$8855 (keyword #f "private")) (_o$8856 #t)) (jolt-hash-map _o$8855 _o$8856)))) + (def-var-with-meta! "jolt.analyzer" "analyze-ffi-callable" (letrec ((analyze-ffi-callable (lambda (ctx items env) (let fnrec8821 ((ctx ctx) (items items) (env env)) (begin (if (jolt-not (<= 4 (jolt-count items) 5)) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "jolt.ffi/foreign-callable expects (foreign-callable f [argtypes] rettype [:collect-safe])")) jolt-nil) (let* ((_o$8822 (keyword #f "op")) (_o$8823 (keyword #f "ffi-callable")) (_o$8824 (keyword #f "fn")) (_o$8825 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$8826 (keyword #f "argtypes")) (_o$8827 (jolt-invoke (var-deref "clojure.core" "mapv") (var-deref "clojure.core" "name") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 2)))) (_o$8828 (keyword #f "rettype")) (_o$8829 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$8830 (keyword #f "collect-safe")) (_o$8831 (let* ((and__25__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__25__auto) (jolt= "collect-safe" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__25__auto)))) (jolt-hash-map _o$8822 _o$8823 _o$8824 _o$8825 _o$8826 _o$8827 _o$8828 _o$8829 _o$8830 _o$8831))))))) analyze-ffi-callable) (let* ((_o$8832 (keyword #f "private")) (_o$8833 #t)) (jolt-hash-map _o$8832 _o$8833)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec8857 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (.-field target) form")) jolt-nil) (let* ((_o$8858 (keyword #f "op")) (_o$8859 (keyword #f "host-call")) (_o$8860 (keyword #f "method")) (_o$8861 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$8862 (keyword #f "target")) (_o$8863 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$8864 (keyword #f "args")) (_o$8865 (jolt-vector))) (jolt-hash-map _o$8858 _o$8859 _o$8860 _o$8861 _o$8862 _o$8863 _o$8864 _o$8865))))))) analyze-field) (let* ((_o$8866 (keyword #f "private")) (_o$8867 #t)) (jolt-hash-map _o$8866 _o$8867)))) + (def-var-with-meta! "jolt.analyzer" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec8834 ((ctx ctx) (items items) (env env)) (begin (if (< (jolt-count items) 3) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (. target member ...) form")) jolt-nil) (let* ((member0 (jolt-nth items 2)) (items (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") member0)) (let* ((ml (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") member0)))) (let* ((_a$8838 (let* ((_o$8835 (jolt-nth items 0)) (_o$8836 (jolt-nth items 1)) (_o$8837 (jolt-first ml))) (jolt-vector _o$8835 _o$8836 _o$8837))) (_a$8839 (jolt-rest ml))) (jolt-into _a$8838 _a$8839))) items)) (target (jolt-nth items 1)) (member (jolt-nth items 2)) (class-target (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") target))) (if (jolt-truthy? and__25__auto) (jolt-not (jolt-invoke (var-deref "jolt.analyzer" "local?") env (jolt-invoke (var-deref "jolt.host" "form-sym-name") target))) and__25__auto))) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx target))) (if (jolt= (keyword #f "class") (jolt-get r (keyword #f "kind"))) (jolt-get r (keyword #f "name")) jolt-nil)) jolt-nil))) (if (jolt-truthy? (let* ((and__25__auto class-target)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") member) and__25__auto))) (let* ((_a$8844 (var-deref "jolt.ir" "invoke")) (_a$8845 (jolt-invoke (var-deref "jolt.ir" "host-static") class-target (jolt-invoke (var-deref "jolt.host" "form-sym-name") member))) (_a$8846 (let* ((_a$8841 (var-deref "clojure.core" "mapv")) (_a$8842 (lambda (p__96_) (let fnrec8840 ((p__96_ p__96_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__96_ env)))) (_a$8843 (jolt-drop 3 items))) (jolt-invoke _a$8841 _a$8842 _a$8843)))) (jolt-invoke _a$8844 _a$8845 _a$8846)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") member)) (let* ((_o$8851 (keyword #f "op")) (_o$8852 (keyword #f "host-call")) (_o$8853 (keyword #f "method")) (_o$8854 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$8855 (keyword #f "target")) (_o$8856 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx target env)) (_o$8857 (keyword #f "args")) (_o$8858 (let* ((_a$8848 (var-deref "clojure.core" "mapv")) (_a$8849 (lambda (p__97_) (let fnrec8847 ((p__97_ p__97_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__97_ env)))) (_a$8850 (jolt-drop 3 items))) (jolt-invoke _a$8848 _a$8849 _a$8850)))) (jolt-hash-map _o$8851 _o$8852 _o$8853 _o$8854 _o$8855 _o$8856 _o$8857 _o$8858)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-keyword?") member)) (let* ((_a$8859 (var-deref "jolt.ir" "invoke")) (_a$8860 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx member env)) (_a$8861 (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)))) (jolt-invoke _a$8859 _a$8860 _a$8861)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "special form . (non-symbol member)") jolt-nil)))))))))) analyze-dot) (let* ((_o$8862 (keyword #f "private")) (_o$8863 #t)) (jolt-hash-map _o$8862 _o$8863)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec8868 ((ctx ctx) (form form) (env env)) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") form)) (ns (jolt-invoke (var-deref "jolt.host" "form-sym-ns") form))) (if (jolt-truthy? (let* ((and__25__auto (jolt-nil? ns))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env nm) and__25__auto))) (let* ((h (jolt-get (jolt-get env (keyword #f "hints")) nm))) (if (jolt-truthy? h) (jolt-assoc (jolt-invoke (var-deref "jolt.ir" "local") nm) (keyword #f "hint") h) (jolt-invoke (var-deref "jolt.ir" "local") nm))) (if (jolt-truthy? ns) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx form))) (if (jolt= (keyword #f "var") (jolt-get r (keyword #f "kind"))) (let* ((G__150 (let* ((_a$8869 (var-deref "jolt.ir" "var-ref")) (_a$8870 (jolt-get r (keyword #f "ns"))) (_a$8871 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8869 _a$8870 _a$8871)))) (let* ((G__151 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__150 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__150))) G__151)) (jolt-invoke (var-deref "jolt.ir" "host-static") ns nm))) (if (jolt-truthy? (keyword #f "else")) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx form))) (let* ((G__152 (jolt-get r (keyword #f "kind")))) (if (jolt= G__152 (keyword #f "var")) (let* ((G__153 (let* ((_a$8872 (var-deref "jolt.ir" "var-ref")) (_a$8873 (jolt-get r (keyword #f "ns"))) (_a$8874 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8872 _a$8873 _a$8874)))) (let* ((G__154 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__153 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__153))) G__154)) (if (jolt= G__152 (keyword #f "host")) (jolt-invoke (var-deref "jolt.ir" "host-ref") (jolt-get r (keyword #f "name"))) (if (jolt= G__152 (keyword #f "class")) (jolt-invoke (var-deref "jolt.ir" "const") (jolt-get r (keyword #f "name"))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "late-bind?") ctx)) (jolt-invoke (var-deref "jolt.ir" "var-ref") (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx) nm) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "Unable to resolve symbol: " nm " in this context")))))))) jolt-nil)))))))) analyze-symbol) (let* ((_o$8875 (keyword #f "private")) (_o$8876 #t)) (jolt-hash-map _o$8875 _o$8876)))) + (def-var-with-meta! "jolt.analyzer" "analyze-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec8864 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (.-field target) form")) jolt-nil) (let* ((_o$8865 (keyword #f "op")) (_o$8866 (keyword #f "host-call")) (_o$8867 (keyword #f "method")) (_o$8868 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$8869 (keyword #f "target")) (_o$8870 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$8871 (keyword #f "args")) (_o$8872 (jolt-vector))) (jolt-hash-map _o$8865 _o$8866 _o$8867 _o$8868 _o$8869 _o$8870 _o$8871 _o$8872))))))) analyze-field) (let* ((_o$8873 (keyword #f "private")) (_o$8874 #t)) (jolt-hash-map _o$8873 _o$8874)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "analyze-list" (letrec ((analyze-list (lambda (ctx form env) (let fnrec8877 ((ctx ctx) (form form) (env env)) (let* ((items (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") form)))) (if (jolt-zero? (jolt-count items)) (jolt-invoke (var-deref "jolt.ir" "quote-node") form) (let* ((head (jolt-first items)) (hname (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (jolt-nil? (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil)) (sf-name (let* ((or__26__auto hname)) (if (jolt-truthy? or__26__auto) or__26__auto (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "clojure.core" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__25__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil)))) (shadowed (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env hname) and__25__auto)))) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not (jolt-contains? (var-deref "jolt.analyzer" "handled") sf-name)))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-macro?") ctx head) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((node (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-invoke (var-deref "jolt.host" "form-expand-1") ctx form) env)) (p (jolt-invoke (var-deref "jolt.host" "form-position") form))) (if (jolt-truthy? (let* ((and__25__auto p)) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "def") (jolt-get node (keyword #f "op"))) and__25__auto))) (jolt-assoc node (keyword #f "pos") p) node)) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "jolt.ffi" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__25__auto) (jolt= "__cfn" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-fn") ctx items env) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "jolt.ffi" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__25__auto) (jolt= "__ccallable" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-callable") ctx items env) (if (jolt-truthy? (let* ((and__25__auto sf-name)) (if (jolt-truthy? and__25__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") sf-name) and__25__auto))) (let* ((node (jolt-invoke (var-deref "jolt.analyzer" "analyze-special") ctx sf-name items env)) (p (jolt-invoke (var-deref "jolt.host" "form-position") form))) (if (jolt-truthy? (let* ((and__25__auto p)) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "def") (jolt-get node (keyword #f "op"))) and__25__auto))) (jolt-assoc node (keyword #f "pos") p) node)) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "method-head?") hname) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-host-call") ctx hname items env) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "ctor-head?") hname) and__25__auto)) and__25__auto))) (let* ((_a$8878 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$8879 ctx) (_a$8880 (jolt-invoke (var-deref "clojure.core" "subs") hname 0 (jolt-dec (jolt-count hname)))) (_a$8881 (jolt-rest items)) (_a$8882 env)) (jolt-invoke _a$8878 _a$8879 _a$8880 _a$8881 _a$8882)) (if (jolt-truthy? (let* ((and__25__auto (jolt= hname "new"))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (>= (jolt-count items) 2))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1)) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((_a$8883 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$8884 ctx) (_a$8885 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1))) (_a$8886 (jolt-drop 2 items)) (_a$8887 env)) (jolt-invoke _a$8883 _a$8884 _a$8885 _a$8886 _a$8887)) (if (let* ((and__25__auto (jolt= hname "."))) (if (jolt-truthy? and__25__auto) (jolt-not shadowed) and__25__auto)) (jolt-invoke (var-deref "jolt.analyzer" "analyze-dot") ctx items env) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") hname) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-field") ctx hname items env) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-special?") hname) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "special form " hname)) (if (jolt-truthy? (keyword #f "else")) (let* ((n (let* ((_a$8892 (var-deref "jolt.ir" "invoke")) (_a$8893 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env)) (_a$8894 (let* ((_a$8889 (var-deref "clojure.core" "mapv")) (_a$8890 (lambda (p__98_) (let fnrec8888 ((p__98_ p__98_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__98_ env)))) (_a$8891 (jolt-rest items))) (jolt-invoke _a$8889 _a$8890 _a$8891)))) (jolt-invoke _a$8892 _a$8893 _a$8894))) (p (jolt-invoke (var-deref "jolt.host" "form-position") form))) (if (jolt-truthy? p) (jolt-assoc n (keyword #f "pos") p) n)) jolt-nil)))))))))))))))))) analyze-list) (let* ((_o$8895 (keyword #f "private")) (_o$8896 #t)) (jolt-hash-map _o$8895 _o$8896)))) + (def-var-with-meta! "jolt.analyzer" "analyze-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec8875 ((ctx ctx) (form form) (env env)) (let* ((nm (jolt-invoke (var-deref "jolt.host" "form-sym-name") form)) (ns (jolt-invoke (var-deref "jolt.host" "form-sym-ns") form))) (if (jolt-truthy? (let* ((and__25__auto (jolt-nil? ns))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env nm) and__25__auto))) (let* ((h (jolt-get (jolt-get env (keyword #f "hints")) nm))) (if (jolt-truthy? h) (jolt-assoc (jolt-invoke (var-deref "jolt.ir" "local") nm) (keyword #f "hint") h) (jolt-invoke (var-deref "jolt.ir" "local") nm))) (if (jolt-truthy? ns) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx form))) (if (jolt= (keyword #f "var") (jolt-get r (keyword #f "kind"))) (let* ((G__150 (let* ((_a$8876 (var-deref "jolt.ir" "var-ref")) (_a$8877 (jolt-get r (keyword #f "ns"))) (_a$8878 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8876 _a$8877 _a$8878)))) (let* ((G__151 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__150 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__150))) G__151)) (jolt-invoke (var-deref "jolt.ir" "host-static") ns nm))) (if (jolt-truthy? (keyword #f "else")) (let* ((r (jolt-invoke (var-deref "jolt.host" "resolve-global") ctx form))) (let* ((G__152 (jolt-get r (keyword #f "kind")))) (if (jolt= G__152 (keyword #f "var")) (let* ((G__153 (let* ((_a$8879 (var-deref "jolt.ir" "var-ref")) (_a$8880 (jolt-get r (keyword #f "ns"))) (_a$8881 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$8879 _a$8880 _a$8881)))) (let* ((G__154 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__153 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__153))) G__154)) (if (jolt= G__152 (keyword #f "host")) (jolt-invoke (var-deref "jolt.ir" "host-ref") (jolt-get r (keyword #f "name"))) (if (jolt= G__152 (keyword #f "class")) (jolt-invoke (var-deref "jolt.ir" "const") (jolt-get r (keyword #f "name"))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "late-bind?") ctx)) (jolt-invoke (var-deref "jolt.ir" "var-ref") (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx) nm) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "Unable to resolve symbol: " nm " in this context")))))))) jolt-nil)))))))) analyze-symbol) (let* ((_o$8882 (keyword #f "private")) (_o$8883 #t)) (jolt-hash-map _o$8882 _o$8883)))) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "with-coll-meta" (letrec ((with-coll-meta (lambda (ctx form env node) (let fnrec8897 ((ctx ctx) (form form) (env env) (node node)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-coll-meta") form))) (if (jolt-nil? m) node (let* ((_a$8900 (var-deref "jolt.ir" "invoke")) (_a$8901 (jolt-invoke (var-deref "jolt.ir" "var-ref") "clojure.core" "with-meta")) (_a$8902 (let* ((_o$8898 node) (_o$8899 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx m env))) (jolt-vector _o$8898 _o$8899)))) (jolt-invoke _a$8900 _a$8901 _a$8902)))))))) with-coll-meta) (let* ((_o$8903 (keyword #f "private")) (_o$8904 #t)) (jolt-hash-map _o$8903 _o$8904)))) + (def-var-with-meta! "jolt.analyzer" "analyze-list" (letrec ((analyze-list (lambda (ctx form env) (let fnrec8884 ((ctx ctx) (form form) (env env)) (let* ((items (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") form)))) (if (jolt-zero? (jolt-count items)) (jolt-invoke (var-deref "jolt.ir" "quote-node") form) (let* ((head (jolt-first items)) (hname (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (jolt-nil? (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil)) (sf-name (let* ((or__26__auto hname)) (if (jolt-truthy? or__26__auto) or__26__auto (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "clojure.core" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__25__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil)))) (shadowed (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env hname) and__25__auto)))) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not (jolt-contains? (var-deref "jolt.analyzer" "handled") sf-name)))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-macro?") ctx head) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((node (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-invoke (var-deref "jolt.host" "form-expand-1") ctx form (jolt-invoke (var-deref "jolt.analyzer" "amp-env-map") env)) env)) (p (jolt-invoke (var-deref "jolt.host" "form-position") form))) (if (jolt-truthy? (let* ((and__25__auto p)) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "def") (jolt-get node (keyword #f "op"))) and__25__auto))) (jolt-assoc node (keyword #f "pos") p) node)) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "jolt.ffi" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__25__auto) (jolt= "__cfn" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-fn") ctx items env) (if (jolt-truthy? (let* ((and__25__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt= "jolt.ffi" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__25__auto) (jolt= "__ccallable" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-callable") ctx items env) (if (jolt-truthy? (let* ((and__25__auto sf-name)) (if (jolt-truthy? and__25__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") sf-name) and__25__auto))) (let* ((node (jolt-invoke (var-deref "jolt.analyzer" "analyze-special") ctx sf-name items env)) (p (jolt-invoke (var-deref "jolt.host" "form-position") form))) (if (jolt-truthy? (let* ((and__25__auto p)) (if (jolt-truthy? and__25__auto) (jolt= (keyword #f "def") (jolt-get node (keyword #f "op"))) and__25__auto))) (jolt-assoc node (keyword #f "pos") p) node)) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "method-head?") hname) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-host-call") ctx hname items env) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "ctor-head?") hname) and__25__auto)) and__25__auto))) (let* ((_a$8885 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$8886 ctx) (_a$8887 (jolt-invoke (var-deref "clojure.core" "subs") hname 0 (jolt-dec (jolt-count hname)))) (_a$8888 (jolt-rest items)) (_a$8889 env)) (jolt-invoke _a$8885 _a$8886 _a$8887 _a$8888 _a$8889)) (if (jolt-truthy? (let* ((and__25__auto (jolt= hname "new"))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (>= (jolt-count items) 2))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1)) and__25__auto)) and__25__auto)) and__25__auto))) (let* ((_a$8890 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$8891 ctx) (_a$8892 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1))) (_a$8893 (jolt-drop 2 items)) (_a$8894 env)) (jolt-invoke _a$8890 _a$8891 _a$8892 _a$8893 _a$8894)) (if (let* ((and__25__auto (jolt= hname "."))) (if (jolt-truthy? and__25__auto) (jolt-not shadowed) and__25__auto)) (jolt-invoke (var-deref "jolt.analyzer" "analyze-dot") ctx items env) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") hname) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-field") ctx hname items env) (if (jolt-truthy? (let* ((and__25__auto hname)) (if (jolt-truthy? and__25__auto) (let* ((and__25__auto (jolt-not shadowed))) (if (jolt-truthy? and__25__auto) (jolt-invoke (var-deref "jolt.host" "form-special?") hname) and__25__auto)) and__25__auto))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "special form " hname)) (if (jolt-truthy? (keyword #f "else")) (let* ((n (let* ((_a$8899 (var-deref "jolt.ir" "invoke")) (_a$8900 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env)) (_a$8901 (let* ((_a$8896 (var-deref "clojure.core" "mapv")) (_a$8897 (lambda (p__98_) (let fnrec8895 ((p__98_ p__98_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__98_ env)))) (_a$8898 (jolt-rest items))) (jolt-invoke _a$8896 _a$8897 _a$8898)))) (jolt-invoke _a$8899 _a$8900 _a$8901))) (p (jolt-invoke (var-deref "jolt.host" "form-position") form))) (if (jolt-truthy? p) (jolt-assoc n (keyword #f "pos") p) n)) jolt-nil)))))))))))))))))) analyze-list) (let* ((_o$8902 (keyword #f "private")) (_o$8903 #t)) (jolt-hash-map _o$8902 _o$8903)))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze" (letrec ((analyze (case-lambda ((ctx form) (let fnrec8905 ((ctx ctx) (form form)) (analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env"))))) ((ctx form env) (let fnrec8906 ((ctx ctx) (form form) (env env)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-literal?") form)) (jolt-invoke (var-deref "jolt.ir" "const") form) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") form)) (jolt-invoke (var-deref "jolt.analyzer" "analyze-symbol") ctx form env) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-vec?") form)) (jolt-invoke (var-deref "jolt.analyzer" "with-coll-meta") ctx form env (jolt-invoke (var-deref "jolt.ir" "vector-node") (let* ((_a$8908 (var-deref "clojure.core" "mapv")) (_a$8909 (lambda (p__99_) (let fnrec8907 ((p__99_ p__99_)) (analyze ctx p__99_ env)))) (_a$8910 (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (jolt-invoke _a$8908 _a$8909 _a$8910)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.analyzer" "with-coll-meta") ctx form env (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$8914 (var-deref "clojure.core" "mapv")) (_a$8915 (lambda (p) (let fnrec8911 ((p p)) (let* ((_o$8912 (analyze ctx (jolt-first p) env)) (_o$8913 (analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$8912 _o$8913))))) (_a$8916 (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (jolt-invoke _a$8914 _a$8915 _a$8916)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.analyzer" "with-coll-meta") ctx form env (jolt-invoke (var-deref "jolt.ir" "set-node") (let* ((_a$8918 (var-deref "clojure.core" "mapv")) (_a$8919 (lambda (p__100_) (let fnrec8917 ((p__100_ p__100_)) (analyze ctx p__100_ env)))) (_a$8920 (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (jolt-invoke _a$8918 _a$8919 _a$8920)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") form)) (jolt-invoke (var-deref "jolt.analyzer" "analyze-list") ctx form env) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-regex?") form)) (let* ((_o$8921 (keyword #f "op")) (_o$8922 (keyword #f "regex")) (_o$8923 (keyword #f "source")) (_o$8924 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$8921 _o$8922 _o$8923 _o$8924)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$8925 (keyword #f "op")) (_o$8926 (keyword #f "inst")) (_o$8927 (keyword #f "source")) (_o$8928 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$8925 _o$8926 _o$8927 _o$8928)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$8929 (keyword #f "op")) (_o$8930 (keyword #f "uuid")) (_o$8931 (keyword #f "source")) (_o$8932 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$8929 _o$8930 _o$8931 _o$8932)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-bigdec?") form)) (let* ((_o$8933 (keyword #f "op")) (_o$8934 (keyword #f "bigdec")) (_o$8935 (keyword #f "source")) (_o$8936 (jolt-invoke (var-deref "jolt.host" "form-bigdec-source") form))) (jolt-hash-map _o$8933 _o$8934 _o$8935 _o$8936)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-ns-value?") form)) (let* ((_o$8937 (keyword #f "op")) (_o$8938 (keyword #f "the-ns")) (_o$8939 (keyword #f "name")) (_o$8940 (jolt-invoke (var-deref "jolt.host" "form-ns-value-name") form))) (jolt-hash-map _o$8937 _o$8938 _o$8939 _o$8940)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "unsupported form") jolt-nil))))))))))))))))) analyze))) + (def-var-with-meta! "jolt.analyzer" "with-coll-meta" (letrec ((with-coll-meta (lambda (ctx form env node) (let fnrec8904 ((ctx ctx) (form form) (env env) (node node)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-coll-meta") form))) (if (jolt-nil? m) node (let* ((_a$8907 (var-deref "jolt.ir" "invoke")) (_a$8908 (jolt-invoke (var-deref "jolt.ir" "var-ref") "clojure.core" "with-meta")) (_a$8909 (let* ((_o$8905 node) (_o$8906 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx m env))) (jolt-vector _o$8905 _o$8906)))) (jolt-invoke _a$8907 _a$8908 _a$8909)))))))) with-coll-meta) (let* ((_o$8910 (keyword #f "private")) (_o$8911 #t)) (jolt-hash-map _o$8910 _o$8911)))) +(guard (e (#t #f)) + (def-var! "jolt.analyzer" "analyze" (letrec ((analyze (case-lambda ((ctx form) (let fnrec8912 ((ctx ctx) (form form)) (analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env"))))) ((ctx form env) (let fnrec8913 ((ctx ctx) (form form) (env env)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-literal?") form)) (jolt-invoke (var-deref "jolt.ir" "const") form) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") form)) (jolt-invoke (var-deref "jolt.analyzer" "analyze-symbol") ctx form env) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-vec?") form)) (jolt-invoke (var-deref "jolt.analyzer" "with-coll-meta") ctx form env (jolt-invoke (var-deref "jolt.ir" "vector-node") (let* ((_a$8915 (var-deref "clojure.core" "mapv")) (_a$8916 (lambda (p__99_) (let fnrec8914 ((p__99_ p__99_)) (analyze ctx p__99_ env)))) (_a$8917 (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (jolt-invoke _a$8915 _a$8916 _a$8917)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.analyzer" "with-coll-meta") ctx form env (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$8921 (var-deref "clojure.core" "mapv")) (_a$8922 (lambda (p) (let fnrec8918 ((p p)) (let* ((_o$8919 (analyze ctx (jolt-first p) env)) (_o$8920 (analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$8919 _o$8920))))) (_a$8923 (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (jolt-invoke _a$8921 _a$8922 _a$8923)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.analyzer" "with-coll-meta") ctx form env (jolt-invoke (var-deref "jolt.ir" "set-node") (let* ((_a$8925 (var-deref "clojure.core" "mapv")) (_a$8926 (lambda (p__100_) (let fnrec8924 ((p__100_ p__100_)) (analyze ctx p__100_ env)))) (_a$8927 (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (jolt-invoke _a$8925 _a$8926 _a$8927)))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-list?") form)) (jolt-invoke (var-deref "jolt.analyzer" "analyze-list") ctx form env) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-regex?") form)) (let* ((_o$8928 (keyword #f "op")) (_o$8929 (keyword #f "regex")) (_o$8930 (keyword #f "source")) (_o$8931 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$8928 _o$8929 _o$8930 _o$8931)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$8932 (keyword #f "op")) (_o$8933 (keyword #f "inst")) (_o$8934 (keyword #f "source")) (_o$8935 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$8932 _o$8933 _o$8934 _o$8935)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$8936 (keyword #f "op")) (_o$8937 (keyword #f "uuid")) (_o$8938 (keyword #f "source")) (_o$8939 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$8936 _o$8937 _o$8938 _o$8939)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-bigdec?") form)) (let* ((_o$8940 (keyword #f "op")) (_o$8941 (keyword #f "bigdec")) (_o$8942 (keyword #f "source")) (_o$8943 (jolt-invoke (var-deref "jolt.host" "form-bigdec-source") form))) (jolt-hash-map _o$8940 _o$8941 _o$8942 _o$8943)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-ns-value?") form)) (let* ((_o$8944 (keyword #f "op")) (_o$8945 (keyword #f "the-ns")) (_o$8946 (keyword #f "name")) (_o$8947 (jolt-invoke (var-deref "jolt.host" "form-ns-value-name") form))) (jolt-hash-map _o$8944 _o$8945 _o$8946 _o$8947)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "unsupported form") jolt-nil))))))))))))))))) analyze))) (guard (e (#t #f)) (def-var-with-meta! "jolt.backend-scheme" "native-ops" (let* ((_o$7153 "+") (_o$7154 "+") (_o$7155 "-") (_o$7156 "-") (_o$7157 "*") (_o$7158 "*") (_o$7159 "/") (_o$7160 "/") (_o$7161 "<") (_o$7162 "<") (_o$7163 ">") (_o$7164 ">") (_o$7165 "<=") (_o$7166 "<=") (_o$7167 ">=") (_o$7168 ">=") (_o$7169 "=") (_o$7170 "jolt=") (_o$7171 "inc") (_o$7172 "jolt-inc") (_o$7173 "dec") (_o$7174 "jolt-dec") (_o$7175 "not") (_o$7176 "jolt-not") (_o$7177 "min") (_o$7178 "min") (_o$7179 "max") (_o$7180 "max") (_o$7181 "mod") (_o$7182 "modulo") (_o$7183 "rem") (_o$7184 "remainder") (_o$7185 "quot") (_o$7186 "quotient") (_o$7187 "vector") (_o$7188 "jolt-vector") (_o$7189 "hash-map") (_o$7190 "jolt-hash-map-fn") (_o$7191 "hash-set") (_o$7192 "jolt-hash-set") (_o$7193 "conj") (_o$7194 "jolt-conj") (_o$7195 "get") (_o$7196 "jolt-get") (_o$7197 "nth") (_o$7198 "jolt-nth") (_o$7199 "count") (_o$7200 "jolt-count") (_o$7201 "assoc") (_o$7202 "jolt-assoc") (_o$7203 "dissoc") (_o$7204 "jolt-dissoc") (_o$7205 "contains?") (_o$7206 "jolt-contains?") (_o$7207 "empty?") (_o$7208 "jolt-empty?") (_o$7209 "peek") (_o$7210 "jolt-peek") (_o$7211 "pop") (_o$7212 "jolt-pop") (_o$7213 "first") (_o$7214 "jolt-first") (_o$7215 "rest") (_o$7216 "jolt-rest") (_o$7217 "next") (_o$7218 "jolt-next") (_o$7219 "seq") (_o$7220 "jolt-seq") (_o$7221 "cons") (_o$7222 "jolt-cons") (_o$7223 "list") (_o$7224 "jolt-list") (_o$7225 "reverse") (_o$7226 "jolt-reverse") (_o$7227 "last") (_o$7228 "jolt-last") (_o$7229 "map") (_o$7230 "jolt-map") (_o$7231 "filter") (_o$7232 "jolt-filter") (_o$7233 "remove") (_o$7234 "jolt-remove") (_o$7235 "reduce") (_o$7236 "jolt-reduce") (_o$7237 "into") (_o$7238 "jolt-into") (_o$7239 "concat") (_o$7240 "jolt-concat") (_o$7241 "apply") (_o$7242 "jolt-apply") (_o$7243 "range") (_o$7244 "jolt-range") (_o$7245 "take") (_o$7246 "jolt-take") (_o$7247 "drop") (_o$7248 "jolt-drop") (_o$7249 "keys") (_o$7250 "jolt-keys") (_o$7251 "vals") (_o$7252 "jolt-vals") (_o$7253 "even?") (_o$7254 "jolt-even?") (_o$7255 "odd?") (_o$7256 "jolt-odd?") (_o$7257 "pos?") (_o$7258 "jolt-pos?") (_o$7259 "neg?") (_o$7260 "jolt-neg?") (_o$7261 "zero?") (_o$7262 "jolt-zero?") (_o$7263 "identity") (_o$7264 "jolt-identity") (_o$7265 "nil?") (_o$7266 "jolt-nil?") (_o$7267 "some?") (_o$7268 "jolt-some?") (_o$7269 "ex-info") (_o$7270 "jolt-ex-info") (_o$7271 "protocol-dispatch1") (_o$7272 "protocol-dispatch1") (_o$7273 "protocol-dispatch2") (_o$7274 "protocol-dispatch2") (_o$7275 "protocol-dispatch3") (_o$7276 "protocol-dispatch3")) (jolt-hash-map _o$7153 _o$7154 _o$7155 _o$7156 _o$7157 _o$7158 _o$7159 _o$7160 _o$7161 _o$7162 _o$7163 _o$7164 _o$7165 _o$7166 _o$7167 _o$7168 _o$7169 _o$7170 _o$7171 _o$7172 _o$7173 _o$7174 _o$7175 _o$7176 _o$7177 _o$7178 _o$7179 _o$7180 _o$7181 _o$7182 _o$7183 _o$7184 _o$7185 _o$7186 _o$7187 _o$7188 _o$7189 _o$7190 _o$7191 _o$7192 _o$7193 _o$7194 _o$7195 _o$7196 _o$7197 _o$7198 _o$7199 _o$7200 _o$7201 _o$7202 _o$7203 _o$7204 _o$7205 _o$7206 _o$7207 _o$7208 _o$7209 _o$7210 _o$7211 _o$7212 _o$7213 _o$7214 _o$7215 _o$7216 _o$7217 _o$7218 _o$7219 _o$7220 _o$7221 _o$7222 _o$7223 _o$7224 _o$7225 _o$7226 _o$7227 _o$7228 _o$7229 _o$7230 _o$7231 _o$7232 _o$7233 _o$7234 _o$7235 _o$7236 _o$7237 _o$7238 _o$7239 _o$7240 _o$7241 _o$7242 _o$7243 _o$7244 _o$7245 _o$7246 _o$7247 _o$7248 _o$7249 _o$7250 _o$7251 _o$7252 _o$7253 _o$7254 _o$7255 _o$7256 _o$7257 _o$7258 _o$7259 _o$7260 _o$7261 _o$7262 _o$7263 _o$7264 _o$7265 _o$7266 _o$7267 _o$7268 _o$7269 _o$7270 _o$7271 _o$7272 _o$7273 _o$7274 _o$7275 _o$7276)) (let* ((_o$7277 (keyword #f "private")) (_o$7278 #t)) (jolt-hash-map _o$7277 _o$7278)))) (guard (e (#t #f)) diff --git a/jolt-core/jolt/analyzer.clj b/jolt-core/jolt/analyzer.clj index 34e6cce..4489701 100644 --- a/jolt-core/jolt/analyzer.clj +++ b/jolt-core/jolt/analyzer.clj @@ -52,6 +52,11 @@ (defn- empty-env [] {:locals #{} :hints {}}) (defn- local? [env nm] (contains? (:locals env) nm)) (defn- add-locals [env names] (update env :locals #(reduce conj % names))) +;; &env value handed to a macro: a map of each in-scope local SYMBOL to nil +;; (Clojure's &env maps locals to compiler binding objects; consumers like +;; core.logic's matche only read its keys to tell locals from fresh pattern vars). +(defn- amp-env-map [env] + (reduce (fn [m n] (assoc m (symbol n) nil)) {} (:locals env))) (defn- with-recur [env name] (assoc env :recur name)) ;; Type hints. The reader keeps ^hint metadata on the binding symbol. @@ -632,7 +637,7 @@ ;; defn/defn- expand to (def name (fn …)); carry the ORIGINAL form's ;; source offset onto the resulting def, since the macro builds a fresh ;; (def …) with no metadata. So the back end can register fn defs. - (let [node (analyze ctx (form-expand-1 ctx form) env) + (let [node (analyze ctx (form-expand-1 ctx form (amp-env-map env)) env) p (form-position form)] (if (and p (= :def (:op node))) (assoc node :pos p) node)) ;; jolt.ffi/__cfn — the foreign-function special form (always emitted diff --git a/test/chez/corpus.edn b/test/chez/corpus.edn index 40226b3..04f385b 100644 --- a/test/chez/corpus.edn +++ b/test/chez/corpus.edn @@ -3347,4 +3347,6 @@ {:suite "special forms / qualified" :label "clojure.core-qualified special form (from syntax-quote)" :expected "[:g 9]" :actual "(clojure.core/letfn [(g [x] [:g x])] (g 9))"} {:suite "symbols / interning" :label "(str sym) is the symbol's interned name (identity-stable)" :expected "[true true]" :actual "(let [s (quote ?a)] [(identical? (name s) (str s)) (= (str s) \"?a\")])"} {:suite "symbols / interning" :label "equal symbols share an interned name string" :expected "true" :actual "(let [a (quote ?foo) b (quote ?foo)] (identical? (name a) (name b)))"} + {:suite "reader / unquote" :label "~x reads as clojure.core/unquote" :expected "true" :actual "(= (quote (clojure.core/unquote v)) (read-string \"~v\"))"} + {:suite "reader / unquote" :label "~@x reads as clojure.core/unquote-splicing" :expected "true" :actual "(= (quote clojure.core/unquote-splicing) (first (read-string \"~@xs\")))"} ] diff --git a/test/chez/unit.edn b/test/chez/unit.edn index b128c39..fa8dcd1 100644 --- a/test/chez/unit.edn +++ b/test/chez/unit.edn @@ -323,8 +323,8 @@ {:suite "reader" :expr "(= [1 [2 3] {:k :v}] (read-string \"[1 [2 3] {:k :v}]\"))" :expected "true"} {:suite "reader" :expr "(= (quote (quote x)) (read-string \"'x\"))" :expected "true"} {:suite "reader" :expr "(= (quote (clojure.core/deref a)) (read-string \"@a\"))" :expected "true"} - {:suite "reader" :expr "(= (quote (syntax-quote (a (unquote b)))) (read-string \"`(a ~b)\"))" :expected "true"} - {:suite "reader" :expr "(= (quote (unquote-splicing xs)) (read-string \"~@xs\"))" :expected "true"} + {:suite "reader" :expr "(= (quote (syntax-quote (a (clojure.core/unquote b)))) (read-string \"`(a ~b)\"))" :expected "true"} + {:suite "reader" :expr "(= (quote (clojure.core/unquote-splicing xs)) (read-string \"~@xs\"))" :expected "true"} {:suite "reader" :expr "(= 42 (read-string \"; comment\\n42\"))" :expected "true"} {:suite "reader" :expr "(= [1 2] (read-string \"[1 #_ 9 2]\"))" :expected "true"} {:suite "reader" :expr "(nil? (read-string \"\"))" :expected "true"}