From adf00a3b51bbfcd8422276718f41a36d36dc238c Mon Sep 17 00:00:00 2001 From: Yogthos Date: Tue, 23 Jun 2026 01:23:17 -0400 Subject: [PATCH] Extract analyze-def / analyze-set! from analyze-special MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit analyze-special inlined def (~35 lines) and set! while try/letfn/fn* were already helpers. Pull both out and move field-head? above analyze-special so its set! arm and analyze-list reach it without a forward reference — the file's "only analyze is forward-declared" invariant holds again. Pure code motion. --- host/chez/seed/image.ss | 28 +++++---- jolt-core/jolt/analyzer.clj | 120 ++++++++++++++++++------------------ 2 files changed, 77 insertions(+), 71 deletions(-) diff --git a/host/chez/seed/image.ss b/host/chez/seed/image.ss index 233c8f3..b7ddcb0 100644 --- a/host/chez/seed/image.ss +++ b/host/chez/seed/image.ss @@ -79,29 +79,33 @@ (guard (e (#t #f)) (def-var! "jolt.analyzer" "analyze-letfn" (letrec ((analyze-letfn (lambda (ctx items env) (let fnrec4710 ((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__49_) (let fnrec4711 ((p__49_ p__49_)) (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__49_)))))) specs)) (env* (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names)) (binds (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (spec) (let fnrec4712 ((spec spec)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") spec)))) (let* ((_o$4713 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first cl))) (_o$4714 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-cons (jolt-invoke (var-deref "clojure.core" "symbol") "fn") cl) env*))) (jolt-vector _o$4713 _o$4714))))) specs))) (let* ((_o$4715 (keyword #f "op")) (_o$4716 (keyword #f "let")) (_o$4717 (keyword #f "letrec")) (_o$4718 #t) (_o$4719 (keyword #f "bindings")) (_o$4720 binds) (_o$4721 (keyword #f "body")) (_o$4722 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env*))) (jolt-hash-map _o$4715 _o$4716 _o$4717 _o$4718 _o$4719 _o$4720 _o$4721 _o$4722))))))) analyze-letfn))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec4723 ((ctx ctx) (op op) (items items) (env env)) (let* ((G__44 op)) (if (jolt= G__44 "quote") (jolt-invoke (var-deref "jolt.ir" "quote-node") (jolt-invoke (var-deref "clojure.core" "second") items)) (if (jolt= G__44 "if") (begin (if (jolt-truthy? (let* ((or__14__auto (< (jolt-count items) 3))) (if (jolt-truthy? or__14__auto) or__14__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$4724 (var-deref "jolt.ir" "if-node")) (_a$4725 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_a$4726 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (_a$4727 (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$4724 _a$4725 _a$4726 _a$4727))) (if (jolt= G__44 "do") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-rest items) env) (if (jolt= G__44 "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__44 "def") (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$4728 (keyword #f "op")) (_o$4729 (keyword #f "def")) (_o$4730 (keyword #f "ns")) (_o$4731 cur) (_o$4732 (keyword #f "name")) (_o$4733 nm) (_o$4734 (keyword #f "no-init")) (_o$4735 #t)) (jolt-hash-map _o$4728 _o$4729 _o$4730 _o$4731 _o$4732 _o$4733 _o$4734 _o$4735)))) (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__13__auto (> (jolt-count items) 3))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "string?") (jolt-nth items 2)) and__13__auto))) (val-form (jolt-nth items (if (jolt-truthy? has-doc) 3 2))) (base0 (let* ((or__14__auto (jolt-invoke (var-deref "jolt.host" "form-sym-meta") name-sym))) (if (jolt-truthy? or__14__auto) or__14__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) (jolt-invoke (var-deref "jolt.ir" "def-node") cur nm (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env) node-meta)))))) (if (jolt= G__44 "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$4740 (var-deref "jolt.ir" "let-node")) (_a$4741 (jolt-first r)) (_a$4742 (let* ((_a$4736 (var-deref "jolt.analyzer" "analyze-seq")) (_a$4737 ctx) (_a$4738 (jolt-drop 2 items)) (_a$4739 (jolt-invoke (var-deref "clojure.core" "second") r))) (jolt-invoke _a$4736 _a$4737 _a$4738 _a$4739)))) (jolt-invoke _a$4740 _a$4741 _a$4742))) (if (jolt= G__44 "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$4743 (keyword #f "op")) (_o$4744 (keyword #f "loop")) (_o$4745 (keyword #f "recur-name")) (_o$4746 rname) (_o$4747 (keyword #f "bindings")) (_o$4748 (jolt-first r)) (_o$4749 (keyword #f "body")) (_o$4750 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env**))) (jolt-hash-map _o$4743 _o$4744 _o$4745 _o$4746 _o$4747 _o$4748 _o$4749 _o$4750))) (if (jolt= G__44 "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$4755 (keyword #f "op")) (_o$4756 (keyword #f "recur")) (_o$4757 (keyword #f "recur-name")) (_o$4758 rt) (_o$4759 (keyword #f "args")) (_o$4760 (let* ((_a$4752 (var-deref "clojure.core" "mapv")) (_a$4753 (lambda (p__50_) (let fnrec4751 ((p__50_ p__50_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__50_ env)))) (_a$4754 (jolt-rest items))) (jolt-invoke _a$4752 _a$4753 _a$4754)))) (jolt-hash-map _o$4755 _o$4756 _o$4757 _o$4758 _o$4759 _o$4760)))) (if (jolt= G__44 "try") (jolt-invoke (var-deref "jolt.analyzer" "analyze-try") ctx items env) (if (jolt= G__44 "letfn") (jolt-invoke (var-deref "jolt.analyzer" "analyze-letfn") ctx items env) (if (jolt= G__44 "fn*") (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx items env) (if (jolt= G__44 "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__44 "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$4761 (var-deref "jolt.ir" "the-var")) (_a$4762 (jolt-get r (keyword #f "ns"))) (_a$4763 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4761 _a$4762 _a$4763)) (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__44 "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$4764 (keyword #f "op")) (_o$4765 (keyword #f "defmacro")) (_o$4766 (keyword #f "ns")) (_o$4767 cur) (_o$4768 (keyword #f "name")) (_o$4769 nm) (_o$4770 (keyword #f "fn")) (_o$4771 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx fn-form env))) (jolt-hash-map _o$4764 _o$4765 _o$4766 _o$4767 _o$4768 _o$4769 _o$4770 _o$4771)))) (if (jolt= G__44 "set!") (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__13__auto ti)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-pos? (jolt-count ti)))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first ti)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first ti)) jolt-nil))) (if (jolt-truthy? (let* ((and__13__auto thead)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") thead) and__13__auto))) (let* ((_o$4772 (keyword #f "op")) (_o$4773 (keyword #f "set-field")) (_o$4774 (keyword #f "obj")) (_o$4775 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth ti 1) env)) (_o$4776 (keyword #f "field")) (_o$4777 (jolt-invoke (var-deref "clojure.core" "subs") thead 2)) (_o$4778 (keyword #f "val")) (_o$4779 val-node)) (jolt-hash-map _o$4772 _o$4773 _o$4774 _o$4775 _o$4776 _o$4777 _o$4778 _o$4779)) (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$4783 (keyword #f "op")) (_o$4784 (keyword #f "set-var")) (_o$4785 (keyword #f "the-var")) (_o$4786 (let* ((_a$4780 (var-deref "jolt.ir" "the-var")) (_a$4781 (jolt-get r (keyword #f "ns"))) (_a$4782 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4780 _a$4781 _a$4782))) (_o$4787 (keyword #f "val")) (_o$4788 val-node)) (jolt-hash-map _o$4783 _o$4784 _o$4785 _o$4786 _o$4787 _o$4788))))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of an unsupported target") jolt-nil)))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "special form " op)))))))))))))))))))))) analyze-special))) + (def-var! "jolt.analyzer" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec4723 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 2))) (if (jolt-truthy? and__13__auto) (jolt= ".-" (jolt-invoke (var-deref "clojure.core" "subs") nm 0 2)) and__13__auto)))))) field-head?))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec4789 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not (jolt= "-" (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))) and__13__auto)) and__13__auto)) and__13__auto)))))) method-head?))) + (def-var! "jolt.analyzer" "analyze-def" (letrec ((analyze-def (lambda (ctx items env) (let fnrec4724 ((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$4725 (keyword #f "op")) (_o$4726 (keyword #f "def")) (_o$4727 (keyword #f "ns")) (_o$4728 cur) (_o$4729 (keyword #f "name")) (_o$4730 nm) (_o$4731 (keyword #f "no-init")) (_o$4732 #t)) (jolt-hash-map _o$4725 _o$4726 _o$4727 _o$4728 _o$4729 _o$4730 _o$4731 _o$4732)))) (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__13__auto (> (jolt-count items) 3))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "string?") (jolt-nth items 2)) and__13__auto))) (val-form (jolt-nth items (if (jolt-truthy? has-doc) 3 2))) (base0 (let* ((or__14__auto (jolt-invoke (var-deref "jolt.host" "form-sym-meta") name-sym))) (if (jolt-truthy? or__14__auto) or__14__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) (jolt-invoke (var-deref "jolt.ir" "def-node") cur nm (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env) node-meta)))))))))) analyze-def))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec4790 ((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$4795 (keyword #f "op")) (_o$4796 (keyword #f "host-call")) (_o$4797 (keyword #f "method")) (_o$4798 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$4799 (keyword #f "target")) (_o$4800 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$4801 (keyword #f "args")) (_o$4802 (let* ((_a$4792 (var-deref "clojure.core" "mapv")) (_a$4793 (lambda (p__51_) (let fnrec4791 ((p__51_ p__51_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__51_ env)))) (_a$4794 (jolt-drop 2 items))) (jolt-invoke _a$4792 _a$4793 _a$4794)))) (jolt-hash-map _o$4795 _o$4796 _o$4797 _o$4798 _o$4799 _o$4800 _o$4801 _o$4802))))))) analyze-host-call))) + (def-var! "jolt.analyzer" "analyze-set!" (letrec ((analyze-set! (lambda (ctx items env) (let fnrec4733 ((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__13__auto ti)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-pos? (jolt-count ti)))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first ti)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first ti)) jolt-nil))) (if (jolt-truthy? (let* ((and__13__auto thead)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") thead) and__13__auto))) (let* ((_o$4734 (keyword #f "op")) (_o$4735 (keyword #f "set-field")) (_o$4736 (keyword #f "obj")) (_o$4737 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth ti 1) env)) (_o$4738 (keyword #f "field")) (_o$4739 (jolt-invoke (var-deref "clojure.core" "subs") thead 2)) (_o$4740 (keyword #f "val")) (_o$4741 val-node)) (jolt-hash-map _o$4734 _o$4735 _o$4736 _o$4737 _o$4738 _o$4739 _o$4740 _o$4741)) (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$4745 (keyword #f "op")) (_o$4746 (keyword #f "set-var")) (_o$4747 (keyword #f "the-var")) (_o$4748 (let* ((_a$4742 (var-deref "jolt.ir" "the-var")) (_a$4743 (jolt-get r (keyword #f "ns"))) (_a$4744 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4742 _a$4743 _a$4744))) (_o$4749 (keyword #f "val")) (_o$4750 val-node)) (jolt-hash-map _o$4745 _o$4746 _o$4747 _o$4748 _o$4749 _o$4750))))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of an unsupported target") jolt-nil)))))))) analyze-set!))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec4803 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (let* ((_a$4804 (var-deref "clojure.core" "subs")) (_a$4805 nm) (_a$4806 (jolt-dec (jolt-count nm))) (_a$4807 (jolt-count nm))) (jolt-invoke _a$4804 _a$4805 _a$4806 _a$4807))))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1))) and__13__auto)) and__13__auto)))))) ctor-head?))) + (def-var! "jolt.analyzer" "analyze-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec4751 ((ctx ctx) (op op) (items items) (env env)) (let* ((G__44 op)) (if (jolt= G__44 "quote") (jolt-invoke (var-deref "jolt.ir" "quote-node") (jolt-invoke (var-deref "clojure.core" "second") items)) (if (jolt= G__44 "if") (begin (if (jolt-truthy? (let* ((or__14__auto (< (jolt-count items) 3))) (if (jolt-truthy? or__14__auto) or__14__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$4752 (var-deref "jolt.ir" "if-node")) (_a$4753 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_a$4754 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (_a$4755 (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$4752 _a$4753 _a$4754 _a$4755))) (if (jolt= G__44 "do") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-rest items) env) (if (jolt= G__44 "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__44 "def") (jolt-invoke (var-deref "jolt.analyzer" "analyze-def") ctx items env) (if (jolt= G__44 "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$4760 (var-deref "jolt.ir" "let-node")) (_a$4761 (jolt-first r)) (_a$4762 (let* ((_a$4756 (var-deref "jolt.analyzer" "analyze-seq")) (_a$4757 ctx) (_a$4758 (jolt-drop 2 items)) (_a$4759 (jolt-invoke (var-deref "clojure.core" "second") r))) (jolt-invoke _a$4756 _a$4757 _a$4758 _a$4759)))) (jolt-invoke _a$4760 _a$4761 _a$4762))) (if (jolt= G__44 "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$4763 (keyword #f "op")) (_o$4764 (keyword #f "loop")) (_o$4765 (keyword #f "recur-name")) (_o$4766 rname) (_o$4767 (keyword #f "bindings")) (_o$4768 (jolt-first r)) (_o$4769 (keyword #f "body")) (_o$4770 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env**))) (jolt-hash-map _o$4763 _o$4764 _o$4765 _o$4766 _o$4767 _o$4768 _o$4769 _o$4770))) (if (jolt= G__44 "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$4775 (keyword #f "op")) (_o$4776 (keyword #f "recur")) (_o$4777 (keyword #f "recur-name")) (_o$4778 rt) (_o$4779 (keyword #f "args")) (_o$4780 (let* ((_a$4772 (var-deref "clojure.core" "mapv")) (_a$4773 (lambda (p__50_) (let fnrec4771 ((p__50_ p__50_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__50_ env)))) (_a$4774 (jolt-rest items))) (jolt-invoke _a$4772 _a$4773 _a$4774)))) (jolt-hash-map _o$4775 _o$4776 _o$4777 _o$4778 _o$4779 _o$4780)))) (if (jolt= G__44 "try") (jolt-invoke (var-deref "jolt.analyzer" "analyze-try") ctx items env) (if (jolt= G__44 "letfn") (jolt-invoke (var-deref "jolt.analyzer" "analyze-letfn") ctx items env) (if (jolt= G__44 "fn*") (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx items env) (if (jolt= G__44 "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__44 "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$4781 (var-deref "jolt.ir" "the-var")) (_a$4782 (jolt-get r (keyword #f "ns"))) (_a$4783 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4781 _a$4782 _a$4783)) (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__44 "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$4784 (keyword #f "op")) (_o$4785 (keyword #f "defmacro")) (_o$4786 (keyword #f "ns")) (_o$4787 cur) (_o$4788 (keyword #f "name")) (_o$4789 nm) (_o$4790 (keyword #f "fn")) (_o$4791 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx fn-form env))) (jolt-hash-map _o$4784 _o$4785 _o$4786 _o$4787 _o$4788 _o$4789 _o$4790 _o$4791)))) (if (jolt= G__44 "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))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec4808 ((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__52_) (let fnrec4809 ((p__52_ p__52_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__52_ env))) args)))))) analyze-ctor))) + (def-var! "jolt.analyzer" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec4792 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not (jolt= "-" (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 1 2))) and__13__auto)) and__13__auto)) and__13__auto)))))) method-head?))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-ffi-fn" (letrec ((analyze-ffi-fn (lambda (ctx items env) (let fnrec4810 ((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$4811 (keyword #f "op")) (_o$4812 (keyword #f "ffi-fn")) (_o$4813 (keyword #f "csym")) (_o$4814 (jolt-nth items 1)) (_o$4815 (keyword #f "argtypes")) (_o$4816 (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$4817 (keyword #f "rettype")) (_o$4818 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$4819 (keyword #f "blocking")) (_o$4820 (let* ((and__13__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__13__auto) (jolt= "blocking" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__13__auto)))) (jolt-hash-map _o$4811 _o$4812 _o$4813 _o$4814 _o$4815 _o$4816 _o$4817 _o$4818 _o$4819 _o$4820))))))) analyze-ffi-fn))) + (def-var! "jolt.analyzer" "analyze-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec4793 ((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$4798 (keyword #f "op")) (_o$4799 (keyword #f "host-call")) (_o$4800 (keyword #f "method")) (_o$4801 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$4802 (keyword #f "target")) (_o$4803 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$4804 (keyword #f "args")) (_o$4805 (let* ((_a$4795 (var-deref "clojure.core" "mapv")) (_a$4796 (lambda (p__51_) (let fnrec4794 ((p__51_ p__51_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__51_ env)))) (_a$4797 (jolt-drop 2 items))) (jolt-invoke _a$4795 _a$4796 _a$4797)))) (jolt-hash-map _o$4798 _o$4799 _o$4800 _o$4801 _o$4802 _o$4803 _o$4804 _o$4805))))))) analyze-host-call))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec4821 ((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* ((member (jolt-nth items 2))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") member)) (let* ((_o$4826 (keyword #f "op")) (_o$4827 (keyword #f "host-call")) (_o$4828 (keyword #f "method")) (_o$4829 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$4830 (keyword #f "target")) (_o$4831 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$4832 (keyword #f "args")) (_o$4833 (let* ((_a$4823 (var-deref "clojure.core" "mapv")) (_a$4824 (lambda (p__53_) (let fnrec4822 ((p__53_ p__53_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__53_ env)))) (_a$4825 (jolt-drop 3 items))) (jolt-invoke _a$4823 _a$4824 _a$4825)))) (jolt-hash-map _o$4826 _o$4827 _o$4828 _o$4829 _o$4830 _o$4831 _o$4832 _o$4833)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-keyword?") member)) (let* ((_a$4834 (var-deref "jolt.ir" "invoke")) (_a$4835 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx member env)) (_a$4836 (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)))) (jolt-invoke _a$4834 _a$4835 _a$4836)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "special form . (non-symbol member)") jolt-nil))))))))) analyze-dot))) + (def-var! "jolt.analyzer" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec4806 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (let* ((_a$4807 (var-deref "clojure.core" "subs")) (_a$4808 nm) (_a$4809 (jolt-dec (jolt-count nm))) (_a$4810 (jolt-count nm))) (jolt-invoke _a$4807 _a$4808 _a$4809 _a$4810))))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0 1))) and__13__auto)) and__13__auto)))))) ctor-head?))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec4837 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 2))) (if (jolt-truthy? and__13__auto) (jolt= ".-" (jolt-invoke (var-deref "clojure.core" "subs") nm 0 2)) and__13__auto)))))) field-head?))) + (def-var! "jolt.analyzer" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec4811 ((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__52_) (let fnrec4812 ((p__52_ p__52_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__52_ env))) args)))))) analyze-ctor))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec4838 ((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$4839 (keyword #f "op")) (_o$4840 (keyword #f "host-call")) (_o$4841 (keyword #f "method")) (_o$4842 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$4843 (keyword #f "target")) (_o$4844 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$4845 (keyword #f "args")) (_o$4846 (jolt-vector))) (jolt-hash-map _o$4839 _o$4840 _o$4841 _o$4842 _o$4843 _o$4844 _o$4845 _o$4846))))))) analyze-field))) + (def-var! "jolt.analyzer" "analyze-ffi-fn" (letrec ((analyze-ffi-fn (lambda (ctx items env) (let fnrec4813 ((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$4814 (keyword #f "op")) (_o$4815 (keyword #f "ffi-fn")) (_o$4816 (keyword #f "csym")) (_o$4817 (jolt-nth items 1)) (_o$4818 (keyword #f "argtypes")) (_o$4819 (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$4820 (keyword #f "rettype")) (_o$4821 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$4822 (keyword #f "blocking")) (_o$4823 (let* ((and__13__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__13__auto) (jolt= "blocking" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__13__auto)))) (jolt-hash-map _o$4814 _o$4815 _o$4816 _o$4817 _o$4818 _o$4819 _o$4820 _o$4821 _o$4822 _o$4823))))))) analyze-ffi-fn))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec4847 ((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__13__auto (jolt-invoke (var-deref "clojure.core" "nil?") ns))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env nm) and__13__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* ((_a$4848 (var-deref "jolt.ir" "var-ref")) (_a$4849 (jolt-get r (keyword #f "ns"))) (_a$4850 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4848 _a$4849 _a$4850)) (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__45 (jolt-get r (keyword #f "kind")))) (if (jolt= G__45 (keyword #f "var")) (let* ((_a$4851 (var-deref "jolt.ir" "var-ref")) (_a$4852 (jolt-get r (keyword #f "ns"))) (_a$4853 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4851 _a$4852 _a$4853)) (if (jolt= G__45 (keyword #f "host")) (jolt-invoke (var-deref "jolt.ir" "host-ref") (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))) + (def-var! "jolt.analyzer" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec4824 ((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* ((member (jolt-nth items 2))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") member)) (let* ((_o$4829 (keyword #f "op")) (_o$4830 (keyword #f "host-call")) (_o$4831 (keyword #f "method")) (_o$4832 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$4833 (keyword #f "target")) (_o$4834 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$4835 (keyword #f "args")) (_o$4836 (let* ((_a$4826 (var-deref "clojure.core" "mapv")) (_a$4827 (lambda (p__53_) (let fnrec4825 ((p__53_ p__53_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__53_ env)))) (_a$4828 (jolt-drop 3 items))) (jolt-invoke _a$4826 _a$4827 _a$4828)))) (jolt-hash-map _o$4829 _o$4830 _o$4831 _o$4832 _o$4833 _o$4834 _o$4835 _o$4836)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-keyword?") member)) (let* ((_a$4837 (var-deref "jolt.ir" "invoke")) (_a$4838 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx member env)) (_a$4839 (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)))) (jolt-invoke _a$4837 _a$4838 _a$4839)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "special form . (non-symbol member)") jolt-nil))))))))) analyze-dot))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-list" (letrec ((analyze-list (lambda (ctx form env) (let fnrec4854 ((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__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "nil?") (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)) and__13__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil)) (shadowed (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env hname) and__13__auto)))) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-macro?") ctx head) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-invoke (var-deref "jolt.host" "form-expand-1") ctx form) env) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "jolt.ffi" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__13__auto) (jolt= "__cfn" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-fn") ctx items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") hname) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-special") ctx hname items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "method-head?") hname) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-host-call") ctx hname items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "ctor-head?") hname) and__13__auto)) and__13__auto))) (let* ((_a$4855 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$4856 ctx) (_a$4857 (jolt-invoke (var-deref "clojure.core" "subs") hname 0 (jolt-dec (jolt-count hname)))) (_a$4858 (jolt-rest items)) (_a$4859 env)) (jolt-invoke _a$4855 _a$4856 _a$4857 _a$4858 _a$4859)) (if (jolt-truthy? (let* ((and__13__auto (jolt= hname "new"))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= (jolt-count items) 2))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1)) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((_a$4860 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$4861 ctx) (_a$4862 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1))) (_a$4863 (jolt-drop 2 items)) (_a$4864 env)) (jolt-invoke _a$4860 _a$4861 _a$4862 _a$4863 _a$4864)) (if (jolt-truthy? (let* ((and__13__auto (jolt= hname "."))) (if (jolt-truthy? and__13__auto) (jolt-not shadowed) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-dot") ctx items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") hname) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-field") ctx hname items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-special?") hname) and__13__auto)) and__13__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$4869 (var-deref "jolt.ir" "invoke")) (_a$4870 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env)) (_a$4871 (let* ((_a$4866 (var-deref "clojure.core" "mapv")) (_a$4867 (lambda (p__54_) (let fnrec4865 ((p__54_ p__54_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__54_ env)))) (_a$4868 (jolt-rest items))) (jolt-invoke _a$4866 _a$4867 _a$4868)))) (jolt-invoke _a$4869 _a$4870 _a$4871))) (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))) + (def-var! "jolt.analyzer" "analyze-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec4840 ((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$4841 (keyword #f "op")) (_o$4842 (keyword #f "host-call")) (_o$4843 (keyword #f "method")) (_o$4844 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$4845 (keyword #f "target")) (_o$4846 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$4847 (keyword #f "args")) (_o$4848 (jolt-vector))) (jolt-hash-map _o$4841 _o$4842 _o$4843 _o$4844 _o$4845 _o$4846 _o$4847 _o$4848))))))) analyze-field))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze" (letrec ((analyze (case-lambda ((ctx form) (let fnrec4872 ((ctx ctx) (form form)) (jolt-invoke analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env"))))) ((ctx form env) (let fnrec4873 ((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.ir" "vector-node") (let* ((_a$4875 (var-deref "clojure.core" "mapv")) (_a$4876 (lambda (p__55_) (let fnrec4874 ((p__55_ p__55_)) (jolt-invoke analyze ctx p__55_ env)))) (_a$4877 (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (jolt-invoke _a$4875 _a$4876 _a$4877))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$4881 (var-deref "clojure.core" "mapv")) (_a$4882 (lambda (p) (let fnrec4878 ((p p)) (let* ((_o$4879 (jolt-invoke analyze ctx (jolt-first p) env)) (_o$4880 (jolt-invoke analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$4879 _o$4880))))) (_a$4883 (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (jolt-invoke _a$4881 _a$4882 _a$4883))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.ir" "set-node") (let* ((_a$4885 (var-deref "clojure.core" "mapv")) (_a$4886 (lambda (p__56_) (let fnrec4884 ((p__56_ p__56_)) (jolt-invoke analyze ctx p__56_ env)))) (_a$4887 (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (jolt-invoke _a$4885 _a$4886 _a$4887))) (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$4888 (keyword #f "op")) (_o$4889 (keyword #f "regex")) (_o$4890 (keyword #f "source")) (_o$4891 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$4888 _o$4889 _o$4890 _o$4891)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$4892 (keyword #f "op")) (_o$4893 (keyword #f "inst")) (_o$4894 (keyword #f "source")) (_o$4895 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$4892 _o$4893 _o$4894 _o$4895)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$4896 (keyword #f "op")) (_o$4897 (keyword #f "uuid")) (_o$4898 (keyword #f "source")) (_o$4899 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$4896 _o$4897 _o$4898 _o$4899)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-bigdec?") form)) (let* ((_o$4900 (keyword #f "op")) (_o$4901 (keyword #f "bigdec")) (_o$4902 (keyword #f "source")) (_o$4903 (jolt-invoke (var-deref "jolt.host" "form-bigdec-source") form))) (jolt-hash-map _o$4900 _o$4901 _o$4902 _o$4903)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-ns-value?") form)) (let* ((_o$4904 (keyword #f "op")) (_o$4905 (keyword #f "the-ns")) (_o$4906 (keyword #f "name")) (_o$4907 (jolt-invoke (var-deref "jolt.host" "form-ns-value-name") form))) (jolt-hash-map _o$4904 _o$4905 _o$4906 _o$4907)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "unsupported form") jolt-nil))))))))))))))))) analyze))) + (def-var! "jolt.analyzer" "analyze-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec4849 ((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__13__auto (jolt-invoke (var-deref "clojure.core" "nil?") ns))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env nm) and__13__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* ((_a$4850 (var-deref "jolt.ir" "var-ref")) (_a$4851 (jolt-get r (keyword #f "ns"))) (_a$4852 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4850 _a$4851 _a$4852)) (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__45 (jolt-get r (keyword #f "kind")))) (if (jolt= G__45 (keyword #f "var")) (let* ((_a$4853 (var-deref "jolt.ir" "var-ref")) (_a$4854 (jolt-get r (keyword #f "ns"))) (_a$4855 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$4853 _a$4854 _a$4855)) (if (jolt= G__45 (keyword #f "host")) (jolt-invoke (var-deref "jolt.ir" "host-ref") (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))) +(guard (e (#t #f)) + (def-var! "jolt.analyzer" "analyze-list" (letrec ((analyze-list (lambda (ctx form env) (let fnrec4856 ((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__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "nil?") (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)) and__13__auto))) (jolt-invoke (var-deref "jolt.host" "form-sym-name") head) jolt-nil)) (shadowed (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "local?") env hname) and__13__auto)))) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-macro?") ctx head) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-invoke (var-deref "jolt.host" "form-expand-1") ctx form) env) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") head))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "jolt.ffi" (jolt-invoke (var-deref "jolt.host" "form-sym-ns") head)))) (if (jolt-truthy? and__13__auto) (jolt= "__cfn" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-fn") ctx items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") hname) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-special") ctx hname items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "method-head?") hname) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-host-call") ctx hname items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "ctor-head?") hname) and__13__auto)) and__13__auto))) (let* ((_a$4857 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$4858 ctx) (_a$4859 (jolt-invoke (var-deref "clojure.core" "subs") hname 0 (jolt-dec (jolt-count hname)))) (_a$4860 (jolt-rest items)) (_a$4861 env)) (jolt-invoke _a$4857 _a$4858 _a$4859 _a$4860 _a$4861)) (if (jolt-truthy? (let* ((and__13__auto (jolt= hname "new"))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= (jolt-count items) 2))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1)) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((_a$4862 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$4863 ctx) (_a$4864 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1))) (_a$4865 (jolt-drop 2 items)) (_a$4866 env)) (jolt-invoke _a$4862 _a$4863 _a$4864 _a$4865 _a$4866)) (if (jolt-truthy? (let* ((and__13__auto (jolt= hname "."))) (if (jolt-truthy? and__13__auto) (jolt-not shadowed) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-dot") ctx items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.analyzer" "field-head?") hname) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-field") ctx hname items env) (if (jolt-truthy? (let* ((and__13__auto hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-special?") hname) and__13__auto)) and__13__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$4871 (var-deref "jolt.ir" "invoke")) (_a$4872 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env)) (_a$4873 (let* ((_a$4868 (var-deref "clojure.core" "mapv")) (_a$4869 (lambda (p__54_) (let fnrec4867 ((p__54_ p__54_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__54_ env)))) (_a$4870 (jolt-rest items))) (jolt-invoke _a$4868 _a$4869 _a$4870)))) (jolt-invoke _a$4871 _a$4872 _a$4873))) (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))) +(guard (e (#t #f)) + (def-var! "jolt.analyzer" "analyze" (letrec ((analyze (case-lambda ((ctx form) (let fnrec4874 ((ctx ctx) (form form)) (jolt-invoke analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env"))))) ((ctx form env) (let fnrec4875 ((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.ir" "vector-node") (let* ((_a$4877 (var-deref "clojure.core" "mapv")) (_a$4878 (lambda (p__55_) (let fnrec4876 ((p__55_ p__55_)) (jolt-invoke analyze ctx p__55_ env)))) (_a$4879 (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (jolt-invoke _a$4877 _a$4878 _a$4879))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$4883 (var-deref "clojure.core" "mapv")) (_a$4884 (lambda (p) (let fnrec4880 ((p p)) (let* ((_o$4881 (jolt-invoke analyze ctx (jolt-first p) env)) (_o$4882 (jolt-invoke analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$4881 _o$4882))))) (_a$4885 (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (jolt-invoke _a$4883 _a$4884 _a$4885))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.ir" "set-node") (let* ((_a$4887 (var-deref "clojure.core" "mapv")) (_a$4888 (lambda (p__56_) (let fnrec4886 ((p__56_ p__56_)) (jolt-invoke analyze ctx p__56_ env)))) (_a$4889 (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (jolt-invoke _a$4887 _a$4888 _a$4889))) (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$4890 (keyword #f "op")) (_o$4891 (keyword #f "regex")) (_o$4892 (keyword #f "source")) (_o$4893 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$4890 _o$4891 _o$4892 _o$4893)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$4894 (keyword #f "op")) (_o$4895 (keyword #f "inst")) (_o$4896 (keyword #f "source")) (_o$4897 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$4894 _o$4895 _o$4896 _o$4897)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$4898 (keyword #f "op")) (_o$4899 (keyword #f "uuid")) (_o$4900 (keyword #f "source")) (_o$4901 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$4898 _o$4899 _o$4900 _o$4901)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-bigdec?") form)) (let* ((_o$4902 (keyword #f "op")) (_o$4903 (keyword #f "bigdec")) (_o$4904 (keyword #f "source")) (_o$4905 (jolt-invoke (var-deref "jolt.host" "form-bigdec-source") form))) (jolt-hash-map _o$4902 _o$4903 _o$4904 _o$4905)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-ns-value?") form)) (let* ((_o$4906 (keyword #f "op")) (_o$4907 (keyword #f "the-ns")) (_o$4908 (keyword #f "name")) (_o$4909 (jolt-invoke (var-deref "jolt.host" "form-ns-value-name") form))) (jolt-hash-map _o$4906 _o$4907 _o$4908 _o$4909)) (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$3714 "+") (_o$3715 "+") (_o$3716 "-") (_o$3717 "-") (_o$3718 "*") (_o$3719 "*") (_o$3720 "/") (_o$3721 "/") (_o$3722 "<") (_o$3723 "<") (_o$3724 ">") (_o$3725 ">") (_o$3726 "<=") (_o$3727 "<=") (_o$3728 ">=") (_o$3729 ">=") (_o$3730 "=") (_o$3731 "jolt=") (_o$3732 "inc") (_o$3733 "jolt-inc") (_o$3734 "dec") (_o$3735 "jolt-dec") (_o$3736 "not") (_o$3737 "jolt-not") (_o$3738 "min") (_o$3739 "min") (_o$3740 "max") (_o$3741 "max") (_o$3742 "mod") (_o$3743 "modulo") (_o$3744 "rem") (_o$3745 "remainder") (_o$3746 "quot") (_o$3747 "quotient") (_o$3748 "vector") (_o$3749 "jolt-vector") (_o$3750 "hash-map") (_o$3751 "jolt-hash-map") (_o$3752 "hash-set") (_o$3753 "jolt-hash-set") (_o$3754 "conj") (_o$3755 "jolt-conj") (_o$3756 "get") (_o$3757 "jolt-get") (_o$3758 "nth") (_o$3759 "jolt-nth") (_o$3760 "count") (_o$3761 "jolt-count") (_o$3762 "assoc") (_o$3763 "jolt-assoc") (_o$3764 "dissoc") (_o$3765 "jolt-dissoc") (_o$3766 "contains?") (_o$3767 "jolt-contains?") (_o$3768 "empty?") (_o$3769 "jolt-empty?") (_o$3770 "peek") (_o$3771 "jolt-peek") (_o$3772 "pop") (_o$3773 "jolt-pop") (_o$3774 "first") (_o$3775 "jolt-first") (_o$3776 "rest") (_o$3777 "jolt-rest") (_o$3778 "next") (_o$3779 "jolt-next") (_o$3780 "seq") (_o$3781 "jolt-seq") (_o$3782 "cons") (_o$3783 "jolt-cons") (_o$3784 "list") (_o$3785 "jolt-list") (_o$3786 "reverse") (_o$3787 "jolt-reverse") (_o$3788 "last") (_o$3789 "jolt-last") (_o$3790 "map") (_o$3791 "jolt-map") (_o$3792 "filter") (_o$3793 "jolt-filter") (_o$3794 "remove") (_o$3795 "jolt-remove") (_o$3796 "reduce") (_o$3797 "jolt-reduce") (_o$3798 "into") (_o$3799 "jolt-into") (_o$3800 "concat") (_o$3801 "jolt-concat") (_o$3802 "apply") (_o$3803 "jolt-apply") (_o$3804 "range") (_o$3805 "jolt-range") (_o$3806 "take") (_o$3807 "jolt-take") (_o$3808 "drop") (_o$3809 "jolt-drop") (_o$3810 "keys") (_o$3811 "jolt-keys") (_o$3812 "vals") (_o$3813 "jolt-vals") (_o$3814 "even?") (_o$3815 "jolt-even?") (_o$3816 "odd?") (_o$3817 "jolt-odd?") (_o$3818 "pos?") (_o$3819 "jolt-pos?") (_o$3820 "neg?") (_o$3821 "jolt-neg?") (_o$3822 "zero?") (_o$3823 "jolt-zero?") (_o$3824 "identity") (_o$3825 "jolt-identity") (_o$3826 "ex-info") (_o$3827 "jolt-ex-info")) (jolt-hash-map _o$3714 _o$3715 _o$3716 _o$3717 _o$3718 _o$3719 _o$3720 _o$3721 _o$3722 _o$3723 _o$3724 _o$3725 _o$3726 _o$3727 _o$3728 _o$3729 _o$3730 _o$3731 _o$3732 _o$3733 _o$3734 _o$3735 _o$3736 _o$3737 _o$3738 _o$3739 _o$3740 _o$3741 _o$3742 _o$3743 _o$3744 _o$3745 _o$3746 _o$3747 _o$3748 _o$3749 _o$3750 _o$3751 _o$3752 _o$3753 _o$3754 _o$3755 _o$3756 _o$3757 _o$3758 _o$3759 _o$3760 _o$3761 _o$3762 _o$3763 _o$3764 _o$3765 _o$3766 _o$3767 _o$3768 _o$3769 _o$3770 _o$3771 _o$3772 _o$3773 _o$3774 _o$3775 _o$3776 _o$3777 _o$3778 _o$3779 _o$3780 _o$3781 _o$3782 _o$3783 _o$3784 _o$3785 _o$3786 _o$3787 _o$3788 _o$3789 _o$3790 _o$3791 _o$3792 _o$3793 _o$3794 _o$3795 _o$3796 _o$3797 _o$3798 _o$3799 _o$3800 _o$3801 _o$3802 _o$3803 _o$3804 _o$3805 _o$3806 _o$3807 _o$3808 _o$3809 _o$3810 _o$3811 _o$3812 _o$3813 _o$3814 _o$3815 _o$3816 _o$3817 _o$3818 _o$3819 _o$3820 _o$3821 _o$3822 _o$3823 _o$3824 _o$3825 _o$3826 _o$3827)) (jolt-hash-map (keyword #f "private") #t))) (guard (e (#t #f)) diff --git a/jolt-core/jolt/analyzer.clj b/jolt-core/jolt/analyzer.clj index 9ed9f13..86601d1 100644 --- a/jolt-core/jolt/analyzer.clj +++ b/jolt-core/jolt/analyzer.clj @@ -251,6 +251,65 @@ {:op :let :letrec true :bindings binds :body (analyze-seq ctx (drop 2 items) env*)})) +;; A `.-field` head: `(.-field target)` is field access (the dash signals field +;; access to the host-call dispatcher). Defined above analyze-special so its set! +;; arm and analyze-list both reach it without a forward reference. +(defn- field-head? [nm] + (and (> (count nm) 2) (= ".-" (subs nm 0 2)))) + +(defn- analyze-def [ctx items env] + (let [name-sym (nth items 1)] + ;; ^{:map} metadata reads as (def (with-meta name m) v): the metadata is a + ;; runtime expression, so the interpreter evaluates the whole def. + (when-not (form-sym? name-sym) + (uncompilable "def name with map metadata")) + (if (< (count items) 3) + ;; (def name) with no init (declare): intern + reserve the cell so a forward + ;; reference resolves; the back end keys on :no-init. + (let [nm (form-sym-name name-sym) cur (compile-ns ctx)] + (host-intern! ctx cur nm) + {:op :def :ns cur :name nm :no-init true}) + ;; (def name docstring value): docstring is form 2, value form 3 — matching + ;; the interpreter, else the docstring is taken as the value. + (let [nm (form-sym-name name-sym) + cur (compile-ns ctx) + has-doc (and (> (count items) 3) (string? (nth items 2))) + val-form (nth items (if has-doc 3 2)) + base0 (or (form-sym-meta name-sym) {}) + ;; resolve a ^Type hint to its canonical class name at def time, as the + ;; JVM compiler does (^String -> java.lang.String); unknown hints pass. + tag (get base0 :tag) + tag-name (cond (form-sym? tag) (form-sym-name tag) + (string? tag) tag + :else nil) + base-meta (if tag-name + (let [c (resolve-class-hint tag-name)] + (if c (assoc base0 :tag c) base0)) + base0) + node-meta (if has-doc (assoc base-meta :doc (nth items 2)) base-meta)] + (host-intern! ctx cur nm) + (def-node cur nm (analyze ctx val-form env) node-meta))))) + +;; (set! (.-field obj) v) mutates a deftype instance field in place; (set! *var* v) +;; sets the var's innermost thread binding, else its root. A local target (jolt +;; binds fields immutably) or any other shape is uncompilable. +(defn- analyze-set! [ctx items env] + (let [target (nth items 1) + val-node (analyze ctx (nth items 2) env) + ti (when (form-list? target) (vec (form-elements target))) + thead (when (and ti (pos? (count ti)) (form-sym? (first ti))) + (form-sym-name (first ti)))] + (cond + (and thead (field-head? thead)) + {:op :set-field :obj (analyze ctx (nth ti 1) env) + :field (subs thead 2) :val val-node} + (form-sym? target) + (do (when (local? env (form-sym-name target)) (uncompilable "set! of a local")) + (let [r (resolve-global ctx target)] + (when-not (= :var (:kind r)) (uncompilable "set! of a non-var")) + {:op :set-var :the-var (the-var (:ns r) (:name r)) :val val-node})) + :else (uncompilable "set! of an unsupported target")))) + (defn- analyze-special [ctx op items env] (case op "quote" (quote-node (second items)) @@ -265,42 +324,7 @@ (const nil)))) "do" (analyze-seq ctx (rest items) env) "throw" (throw-node (analyze ctx (nth items 1) env)) - "def" (let [name-sym (nth items 1)] - ;; ^{:map} metadata reads as (def (with-meta name m) v) — the - ;; metadata is a runtime expression, so the interpreter evaluates - ;; the whole def (it unwraps the name and merges the meta). - (when-not (form-sym? name-sym) - (uncompilable "def name with map metadata")) - (if (< (count items) 3) - ;; (def name) with no init (declare): intern + reserve the cell so a - ;; forward reference resolves. The back end keys on :no-init — Chez - ;; def-var!s an unbound placeholder; the interpreter interns a - ;; genuinely-unbound var. - (let [nm (form-sym-name name-sym) cur (compile-ns ctx)] - (host-intern! ctx cur nm) - {:op :def :ns cur :name nm :no-init true}) - (let [nm (form-sym-name name-sym) - cur (compile-ns ctx) - ;; (def name docstring value): docstring is form 2, value form 3. - ;; Matches the interpreter; otherwise the docstring is taken as - ;; the value and the real init dropped. - has-doc (and (> (count items) 3) (string? (nth items 2))) - val-form (nth items (if has-doc 3 2)) - base0 (or (form-sym-meta name-sym) {}) - ;; resolve a ^Type hint to its canonical class name at def - ;; time, as the JVM compiler does: ^String -> - ;; java.lang.String. A record/unknown hint is left untouched. - tag (get base0 :tag) - tag-name (cond (form-sym? tag) (form-sym-name tag) - (string? tag) tag - :else nil) - base-meta (if tag-name - (let [c (resolve-class-hint tag-name)] - (if c (assoc base0 :tag c) base0)) - base0) - node-meta (if has-doc (assoc base-meta :doc (nth items 2)) base-meta)] - (host-intern! ctx cur nm) - (def-node cur nm (analyze ctx val-form env) node-meta)))) + "def" (analyze-def ctx items env) "let*" (let [bvec (vec (form-vec-items (nth items 1))) r (analyze-bindings ctx bvec env)] (let-node (first r) (analyze-seq ctx (drop 2 items) (second r)))) @@ -345,24 +369,7 @@ (host-intern! ctx cur nm) {:op :defmacro :ns cur :name nm :fn (analyze ctx fn-form env)}) - "set!" (let [target (nth items 1) - val-node (analyze ctx (nth items 2) env) - ti (when (form-list? target) (vec (form-elements target))) - thead (when (and ti (pos? (count ti)) (form-sym? (first ti))) - (form-sym-name (first ti)))] - (cond - ;; (set! (.-field obj) v): mutate a deftype instance field in place. - ;; A deftype method's (set! mutable-field v) lowers to this shape. - (and thead (field-head? thead)) - {:op :set-field :obj (analyze ctx (nth ti 1) env) - :field (subs thead 2) :val val-node} - ;; (set! *var* v): set the var's innermost binding, else its root. - (form-sym? target) - (do (when (local? env (form-sym-name target)) (uncompilable "set! of a local")) - (let [r (resolve-global ctx target)] - (when-not (= :var (:kind r)) (uncompilable "set! of a non-var")) - {:op :set-var :the-var (the-var (:ns r) (:name r)) :val val-node})) - :else (uncompilable "set! of an unsupported target"))) + "set!" (analyze-set! ctx items env) (uncompilable (str "special form " op)))) ;; Host interop method call. `(.method target arg*)` — a head that @@ -433,11 +440,6 @@ (invoke (analyze ctx member env) [(analyze ctx (nth items 1) env)]) :else (uncompilable "special form . (non-symbol member)")))) -;; A `.-field` head: `(.-field target)` is field access. Lowers to a :host-call -;; with the "-field" method (the dash signals field access to the dispatcher). -(defn- field-head? [nm] - (and (> (count nm) 2) (= ".-" (subs nm 0 2)))) - (defn- analyze-field [ctx hname items env] (when (< (count items) 2) (throw (str "Malformed (.-field target) form")))