From a893e2111132e06409e93d2d0e6683d533af841b Mon Sep 17 00:00:00 2001 From: Yogthos Date: Wed, 24 Jun 2026 00:30:06 -0400 Subject: [PATCH] Share the const-keyword-lookup head predicates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The inliner and the type inferencer each recognized (:k m) and (get m :k) lookups with their own copy of the callee tests — the get-callee check was duplicated verbatim across both. Lift kw-callee?/get-callee? into jolt.passes.fold (alongside scalar-const?) and call them from both passes so the head recognition can't drift. Only the head predicates move. The deliberate differences stay: the inliner still accepts any scalar key in the get-form (its scalar-replacement targets can be string/number-keyed maps) while the inferencer requires keyword keys for struct field typing, and the inferencer keeps its two arms separate so each rebuilds args for its form. The backend's value-as-fn ifn-kind is left alone. --- guestbook.sqlite3 | Bin 0 -> 8192 bytes host/chez/seed/image.ss | 128 ++++++++++++++++--------------- jolt-core/jolt/passes/fold.clj | 16 ++++ jolt-core/jolt/passes/inline.clj | 11 ++- jolt-core/jolt/passes/types.clj | 9 +-- 5 files changed, 91 insertions(+), 73 deletions(-) create mode 100644 guestbook.sqlite3 diff --git a/guestbook.sqlite3 b/guestbook.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..5725fd61c87e5c400323c4453c16caf47a4addb2 GIT binary patch literal 8192 zcmeI#&uRiO5C-r>3ZA6iJUT}U(o0{U(T=h-yVW=gdXjC8vfw|qc>y1w@9VMIf?mDX z?;}GpNlw4p%%-*sp4NwIR|I-dZKbt(B~nW1SdCbh)cwPyiF@7OidN4*=T`isACD?7 z1OgC%00bZa0SG_<0uX=z1R!u10;iU4cDh}CDns$P^_$B3Q0_P1*F$6I*a(xDfn~a0 zQ?Fc6k_nI5(ZnUGaSM9qMW6P?&Xe$5DEo+&Tid6v$``?}mT{#2dwJuL$*s^ZcaAez nN|N$SOgee0XY)ApBM^W91Rwwb2tWV=5P$##AOHaf{9}P%?dCM< literal 0 HcmV?d00001 diff --git a/host/chez/seed/image.ss b/host/chez/seed/image.ss index cd06b53..70df424 100644 --- a/host/chez/seed/image.ss +++ b/host/chez/seed/image.ss @@ -1,123 +1,123 @@ (guard (e (#t #f)) - (def-var! "jolt.ir" "const" (letrec ((const (lambda (v) (let fnrec4788 ((v v)) (let* ((_o$4789 (keyword #f "op")) (_o$4790 (keyword #f "const")) (_o$4791 (keyword #f "val")) (_o$4792 v)) (jolt-hash-map _o$4789 _o$4790 _o$4791 _o$4792)))))) const))) + (def-var! "jolt.ir" "const" (letrec ((const (lambda (v) (let fnrec4790 ((v v)) (let* ((_o$4791 (keyword #f "op")) (_o$4792 (keyword #f "const")) (_o$4793 (keyword #f "val")) (_o$4794 v)) (jolt-hash-map _o$4791 _o$4792 _o$4793 _o$4794)))))) const))) (guard (e (#t #f)) - (def-var! "jolt.ir" "local" (letrec ((local (lambda (name) (let fnrec4793 ((name name)) (let* ((_o$4794 (keyword #f "op")) (_o$4795 (keyword #f "local")) (_o$4796 (keyword #f "name")) (_o$4797 name)) (jolt-hash-map _o$4794 _o$4795 _o$4796 _o$4797)))))) local))) + (def-var! "jolt.ir" "local" (letrec ((local (lambda (name) (let fnrec4795 ((name name)) (let* ((_o$4796 (keyword #f "op")) (_o$4797 (keyword #f "local")) (_o$4798 (keyword #f "name")) (_o$4799 name)) (jolt-hash-map _o$4796 _o$4797 _o$4798 _o$4799)))))) local))) (guard (e (#t #f)) - (def-var! "jolt.ir" "var-ref" (letrec ((var-ref (lambda (ns name) (let fnrec4798 ((ns ns) (name name)) (let* ((_o$4799 (keyword #f "op")) (_o$4800 (keyword #f "var")) (_o$4801 (keyword #f "ns")) (_o$4802 ns) (_o$4803 (keyword #f "name")) (_o$4804 name)) (jolt-hash-map _o$4799 _o$4800 _o$4801 _o$4802 _o$4803 _o$4804)))))) var-ref))) + (def-var! "jolt.ir" "var-ref" (letrec ((var-ref (lambda (ns name) (let fnrec4800 ((ns ns) (name name)) (let* ((_o$4801 (keyword #f "op")) (_o$4802 (keyword #f "var")) (_o$4803 (keyword #f "ns")) (_o$4804 ns) (_o$4805 (keyword #f "name")) (_o$4806 name)) (jolt-hash-map _o$4801 _o$4802 _o$4803 _o$4804 _o$4805 _o$4806)))))) var-ref))) (guard (e (#t #f)) - (def-var! "jolt.ir" "the-var" (letrec ((the-var (lambda (ns name) (let fnrec4805 ((ns ns) (name name)) (let* ((_o$4806 (keyword #f "op")) (_o$4807 (keyword #f "the-var")) (_o$4808 (keyword #f "ns")) (_o$4809 ns) (_o$4810 (keyword #f "name")) (_o$4811 name)) (jolt-hash-map _o$4806 _o$4807 _o$4808 _o$4809 _o$4810 _o$4811)))))) the-var))) + (def-var! "jolt.ir" "the-var" (letrec ((the-var (lambda (ns name) (let fnrec4807 ((ns ns) (name name)) (let* ((_o$4808 (keyword #f "op")) (_o$4809 (keyword #f "the-var")) (_o$4810 (keyword #f "ns")) (_o$4811 ns) (_o$4812 (keyword #f "name")) (_o$4813 name)) (jolt-hash-map _o$4808 _o$4809 _o$4810 _o$4811 _o$4812 _o$4813)))))) the-var))) (guard (e (#t #f)) - (def-var! "jolt.ir" "host-ref" (letrec ((host-ref (lambda (name) (let fnrec4812 ((name name)) (let* ((_o$4813 (keyword #f "op")) (_o$4814 (keyword #f "host")) (_o$4815 (keyword #f "name")) (_o$4816 name)) (jolt-hash-map _o$4813 _o$4814 _o$4815 _o$4816)))))) host-ref))) + (def-var! "jolt.ir" "host-ref" (letrec ((host-ref (lambda (name) (let fnrec4814 ((name name)) (let* ((_o$4815 (keyword #f "op")) (_o$4816 (keyword #f "host")) (_o$4817 (keyword #f "name")) (_o$4818 name)) (jolt-hash-map _o$4815 _o$4816 _o$4817 _o$4818)))))) host-ref))) (guard (e (#t #f)) - (def-var! "jolt.ir" "host-static" (letrec ((host-static (lambda (class member) (let fnrec4817 ((class class) (member member)) (let* ((_o$4818 (keyword #f "op")) (_o$4819 (keyword #f "host-static")) (_o$4820 (keyword #f "class")) (_o$4821 class) (_o$4822 (keyword #f "member")) (_o$4823 member)) (jolt-hash-map _o$4818 _o$4819 _o$4820 _o$4821 _o$4822 _o$4823)))))) host-static))) + (def-var! "jolt.ir" "host-static" (letrec ((host-static (lambda (class member) (let fnrec4819 ((class class) (member member)) (let* ((_o$4820 (keyword #f "op")) (_o$4821 (keyword #f "host-static")) (_o$4822 (keyword #f "class")) (_o$4823 class) (_o$4824 (keyword #f "member")) (_o$4825 member)) (jolt-hash-map _o$4820 _o$4821 _o$4822 _o$4823 _o$4824 _o$4825)))))) host-static))) (guard (e (#t #f)) - (def-var! "jolt.ir" "host-new" (letrec ((host-new (lambda (class args) (let fnrec4824 ((class class) (args args)) (let* ((_o$4825 (keyword #f "op")) (_o$4826 (keyword #f "host-new")) (_o$4827 (keyword #f "class")) (_o$4828 class) (_o$4829 (keyword #f "args")) (_o$4830 args)) (jolt-hash-map _o$4825 _o$4826 _o$4827 _o$4828 _o$4829 _o$4830)))))) host-new))) + (def-var! "jolt.ir" "host-new" (letrec ((host-new (lambda (class args) (let fnrec4826 ((class class) (args args)) (let* ((_o$4827 (keyword #f "op")) (_o$4828 (keyword #f "host-new")) (_o$4829 (keyword #f "class")) (_o$4830 class) (_o$4831 (keyword #f "args")) (_o$4832 args)) (jolt-hash-map _o$4827 _o$4828 _o$4829 _o$4830 _o$4831 _o$4832)))))) host-new))) (guard (e (#t #f)) - (def-var! "jolt.ir" "if-node" (letrec ((if-node (lambda (test then _else) (let fnrec4831 ((test test) (then then) (_else _else)) (let* ((_o$4832 (keyword #f "op")) (_o$4833 (keyword #f "if")) (_o$4834 (keyword #f "test")) (_o$4835 test) (_o$4836 (keyword #f "then")) (_o$4837 then) (_o$4838 (keyword #f "else")) (_o$4839 _else)) (jolt-hash-map _o$4832 _o$4833 _o$4834 _o$4835 _o$4836 _o$4837 _o$4838 _o$4839)))))) if-node))) + (def-var! "jolt.ir" "if-node" (letrec ((if-node (lambda (test then _else) (let fnrec4833 ((test test) (then then) (_else _else)) (let* ((_o$4834 (keyword #f "op")) (_o$4835 (keyword #f "if")) (_o$4836 (keyword #f "test")) (_o$4837 test) (_o$4838 (keyword #f "then")) (_o$4839 then) (_o$4840 (keyword #f "else")) (_o$4841 _else)) (jolt-hash-map _o$4834 _o$4835 _o$4836 _o$4837 _o$4838 _o$4839 _o$4840 _o$4841)))))) if-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "do-node" (letrec ((do-node (lambda (statements ret) (let fnrec4840 ((statements statements) (ret ret)) (let* ((_o$4841 (keyword #f "op")) (_o$4842 (keyword #f "do")) (_o$4843 (keyword #f "statements")) (_o$4844 statements) (_o$4845 (keyword #f "ret")) (_o$4846 ret)) (jolt-hash-map _o$4841 _o$4842 _o$4843 _o$4844 _o$4845 _o$4846)))))) do-node))) + (def-var! "jolt.ir" "do-node" (letrec ((do-node (lambda (statements ret) (let fnrec4842 ((statements statements) (ret ret)) (let* ((_o$4843 (keyword #f "op")) (_o$4844 (keyword #f "do")) (_o$4845 (keyword #f "statements")) (_o$4846 statements) (_o$4847 (keyword #f "ret")) (_o$4848 ret)) (jolt-hash-map _o$4843 _o$4844 _o$4845 _o$4846 _o$4847 _o$4848)))))) do-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "invoke" (letrec ((invoke (lambda (f args) (let fnrec4847 ((f f) (args args)) (let* ((_o$4848 (keyword #f "op")) (_o$4849 (keyword #f "invoke")) (_o$4850 (keyword #f "fn")) (_o$4851 f) (_o$4852 (keyword #f "args")) (_o$4853 args)) (jolt-hash-map _o$4848 _o$4849 _o$4850 _o$4851 _o$4852 _o$4853)))))) invoke))) + (def-var! "jolt.ir" "invoke" (letrec ((invoke (lambda (f args) (let fnrec4849 ((f f) (args args)) (let* ((_o$4850 (keyword #f "op")) (_o$4851 (keyword #f "invoke")) (_o$4852 (keyword #f "fn")) (_o$4853 f) (_o$4854 (keyword #f "args")) (_o$4855 args)) (jolt-hash-map _o$4850 _o$4851 _o$4852 _o$4853 _o$4854 _o$4855)))))) invoke))) (guard (e (#t #f)) - (def-var! "jolt.ir" "def-node" (letrec ((def-node (case-lambda ((ns name init) (let fnrec4854 ((ns ns) (name name) (init init)) (let* ((_o$4855 (keyword #f "op")) (_o$4856 (keyword #f "def")) (_o$4857 (keyword #f "ns")) (_o$4858 ns) (_o$4859 (keyword #f "name")) (_o$4860 name) (_o$4861 (keyword #f "init")) (_o$4862 init)) (jolt-hash-map _o$4855 _o$4856 _o$4857 _o$4858 _o$4859 _o$4860 _o$4861 _o$4862)))) ((ns name init meta) (let fnrec4863 ((ns ns) (name name) (init init) (meta meta)) (if (jolt-truthy? meta) (let* ((_o$4864 (keyword #f "op")) (_o$4865 (keyword #f "def")) (_o$4866 (keyword #f "ns")) (_o$4867 ns) (_o$4868 (keyword #f "name")) (_o$4869 name) (_o$4870 (keyword #f "init")) (_o$4871 init) (_o$4872 (keyword #f "meta")) (_o$4873 meta)) (jolt-hash-map _o$4864 _o$4865 _o$4866 _o$4867 _o$4868 _o$4869 _o$4870 _o$4871 _o$4872 _o$4873)) (let* ((_o$4874 (keyword #f "op")) (_o$4875 (keyword #f "def")) (_o$4876 (keyword #f "ns")) (_o$4877 ns) (_o$4878 (keyword #f "name")) (_o$4879 name) (_o$4880 (keyword #f "init")) (_o$4881 init)) (jolt-hash-map _o$4874 _o$4875 _o$4876 _o$4877 _o$4878 _o$4879 _o$4880 _o$4881)))))))) def-node))) + (def-var! "jolt.ir" "def-node" (letrec ((def-node (case-lambda ((ns name init) (let fnrec4856 ((ns ns) (name name) (init init)) (let* ((_o$4857 (keyword #f "op")) (_o$4858 (keyword #f "def")) (_o$4859 (keyword #f "ns")) (_o$4860 ns) (_o$4861 (keyword #f "name")) (_o$4862 name) (_o$4863 (keyword #f "init")) (_o$4864 init)) (jolt-hash-map _o$4857 _o$4858 _o$4859 _o$4860 _o$4861 _o$4862 _o$4863 _o$4864)))) ((ns name init meta) (let fnrec4865 ((ns ns) (name name) (init init) (meta meta)) (if (jolt-truthy? meta) (let* ((_o$4866 (keyword #f "op")) (_o$4867 (keyword #f "def")) (_o$4868 (keyword #f "ns")) (_o$4869 ns) (_o$4870 (keyword #f "name")) (_o$4871 name) (_o$4872 (keyword #f "init")) (_o$4873 init) (_o$4874 (keyword #f "meta")) (_o$4875 meta)) (jolt-hash-map _o$4866 _o$4867 _o$4868 _o$4869 _o$4870 _o$4871 _o$4872 _o$4873 _o$4874 _o$4875)) (let* ((_o$4876 (keyword #f "op")) (_o$4877 (keyword #f "def")) (_o$4878 (keyword #f "ns")) (_o$4879 ns) (_o$4880 (keyword #f "name")) (_o$4881 name) (_o$4882 (keyword #f "init")) (_o$4883 init)) (jolt-hash-map _o$4876 _o$4877 _o$4878 _o$4879 _o$4880 _o$4881 _o$4882 _o$4883)))))))) def-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "let-node" (letrec ((let-node (lambda (bindings body) (let fnrec4882 ((bindings bindings) (body body)) (let* ((_o$4883 (keyword #f "op")) (_o$4884 (keyword #f "let")) (_o$4885 (keyword #f "bindings")) (_o$4886 bindings) (_o$4887 (keyword #f "body")) (_o$4888 body)) (jolt-hash-map _o$4883 _o$4884 _o$4885 _o$4886 _o$4887 _o$4888)))))) let-node))) + (def-var! "jolt.ir" "let-node" (letrec ((let-node (lambda (bindings body) (let fnrec4884 ((bindings bindings) (body body)) (let* ((_o$4885 (keyword #f "op")) (_o$4886 (keyword #f "let")) (_o$4887 (keyword #f "bindings")) (_o$4888 bindings) (_o$4889 (keyword #f "body")) (_o$4890 body)) (jolt-hash-map _o$4885 _o$4886 _o$4887 _o$4888 _o$4889 _o$4890)))))) let-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "fn-node" (letrec ((fn-node (lambda (name arities) (let fnrec4889 ((name name) (arities arities)) (if (jolt-truthy? name) (let* ((_o$4890 (keyword #f "op")) (_o$4891 (keyword #f "fn")) (_o$4892 (keyword #f "name")) (_o$4893 name) (_o$4894 (keyword #f "arities")) (_o$4895 arities)) (jolt-hash-map _o$4890 _o$4891 _o$4892 _o$4893 _o$4894 _o$4895)) (let* ((_o$4896 (keyword #f "op")) (_o$4897 (keyword #f "fn")) (_o$4898 (keyword #f "arities")) (_o$4899 arities)) (jolt-hash-map _o$4896 _o$4897 _o$4898 _o$4899))))))) fn-node))) + (def-var! "jolt.ir" "fn-node" (letrec ((fn-node (lambda (name arities) (let fnrec4891 ((name name) (arities arities)) (if (jolt-truthy? name) (let* ((_o$4892 (keyword #f "op")) (_o$4893 (keyword #f "fn")) (_o$4894 (keyword #f "name")) (_o$4895 name) (_o$4896 (keyword #f "arities")) (_o$4897 arities)) (jolt-hash-map _o$4892 _o$4893 _o$4894 _o$4895 _o$4896 _o$4897)) (let* ((_o$4898 (keyword #f "op")) (_o$4899 (keyword #f "fn")) (_o$4900 (keyword #f "arities")) (_o$4901 arities)) (jolt-hash-map _o$4898 _o$4899 _o$4900 _o$4901))))))) fn-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "vector-node" (letrec ((vector-node (lambda (items) (let fnrec4900 ((items items)) (let* ((_o$4901 (keyword #f "op")) (_o$4902 (keyword #f "vector")) (_o$4903 (keyword #f "items")) (_o$4904 items)) (jolt-hash-map _o$4901 _o$4902 _o$4903 _o$4904)))))) vector-node))) + (def-var! "jolt.ir" "vector-node" (letrec ((vector-node (lambda (items) (let fnrec4902 ((items items)) (let* ((_o$4903 (keyword #f "op")) (_o$4904 (keyword #f "vector")) (_o$4905 (keyword #f "items")) (_o$4906 items)) (jolt-hash-map _o$4903 _o$4904 _o$4905 _o$4906)))))) vector-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "map-node" (letrec ((map-node (lambda (pairs) (let fnrec4905 ((pairs pairs)) (let* ((_o$4906 (keyword #f "op")) (_o$4907 (keyword #f "map")) (_o$4908 (keyword #f "pairs")) (_o$4909 pairs)) (jolt-hash-map _o$4906 _o$4907 _o$4908 _o$4909)))))) map-node))) + (def-var! "jolt.ir" "map-node" (letrec ((map-node (lambda (pairs) (let fnrec4907 ((pairs pairs)) (let* ((_o$4908 (keyword #f "op")) (_o$4909 (keyword #f "map")) (_o$4910 (keyword #f "pairs")) (_o$4911 pairs)) (jolt-hash-map _o$4908 _o$4909 _o$4910 _o$4911)))))) map-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "set-node" (letrec ((set-node (lambda (items) (let fnrec4910 ((items items)) (let* ((_o$4911 (keyword #f "op")) (_o$4912 (keyword #f "set")) (_o$4913 (keyword #f "items")) (_o$4914 items)) (jolt-hash-map _o$4911 _o$4912 _o$4913 _o$4914)))))) set-node))) + (def-var! "jolt.ir" "set-node" (letrec ((set-node (lambda (items) (let fnrec4912 ((items items)) (let* ((_o$4913 (keyword #f "op")) (_o$4914 (keyword #f "set")) (_o$4915 (keyword #f "items")) (_o$4916 items)) (jolt-hash-map _o$4913 _o$4914 _o$4915 _o$4916)))))) set-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "quote-node" (letrec ((quote-node (lambda (form) (let fnrec4915 ((form form)) (let* ((_o$4916 (keyword #f "op")) (_o$4917 (keyword #f "quote")) (_o$4918 (keyword #f "form")) (_o$4919 form)) (jolt-hash-map _o$4916 _o$4917 _o$4918 _o$4919)))))) quote-node))) + (def-var! "jolt.ir" "quote-node" (letrec ((quote-node (lambda (form) (let fnrec4917 ((form form)) (let* ((_o$4918 (keyword #f "op")) (_o$4919 (keyword #f "quote")) (_o$4920 (keyword #f "form")) (_o$4921 form)) (jolt-hash-map _o$4918 _o$4919 _o$4920 _o$4921)))))) quote-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "throw-node" (letrec ((throw-node (lambda (expr) (let fnrec4920 ((expr expr)) (let* ((_o$4921 (keyword #f "op")) (_o$4922 (keyword #f "throw")) (_o$4923 (keyword #f "expr")) (_o$4924 expr)) (jolt-hash-map _o$4921 _o$4922 _o$4923 _o$4924)))))) throw-node))) + (def-var! "jolt.ir" "throw-node" (letrec ((throw-node (lambda (expr) (let fnrec4922 ((expr expr)) (let* ((_o$4923 (keyword #f "op")) (_o$4924 (keyword #f "throw")) (_o$4925 (keyword #f "expr")) (_o$4926 expr)) (jolt-hash-map _o$4923 _o$4924 _o$4925 _o$4926)))))) throw-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "coerce-node" (letrec ((coerce-node (lambda (kind expr) (let fnrec4925 ((kind kind) (expr expr)) (let* ((_o$4926 (keyword #f "op")) (_o$4927 (keyword #f "coerce")) (_o$4928 (keyword #f "kind")) (_o$4929 kind) (_o$4930 (keyword #f "expr")) (_o$4931 expr)) (jolt-hash-map _o$4926 _o$4927 _o$4928 _o$4929 _o$4930 _o$4931)))))) coerce-node))) + (def-var! "jolt.ir" "coerce-node" (letrec ((coerce-node (lambda (kind expr) (let fnrec4927 ((kind kind) (expr expr)) (let* ((_o$4928 (keyword #f "op")) (_o$4929 (keyword #f "coerce")) (_o$4930 (keyword #f "kind")) (_o$4931 kind) (_o$4932 (keyword #f "expr")) (_o$4933 expr)) (jolt-hash-map _o$4928 _o$4929 _o$4930 _o$4931 _o$4932 _o$4933)))))) coerce-node))) (guard (e (#t #f)) - (def-var! "jolt.ir" "map-ir-children" (letrec ((map-ir-children (lambda (f node) (let fnrec4932 ((f f) (node node)) (let* ((op (jolt-get node (keyword #f "op")))) (if (jolt= op (keyword #f "if")) (let* ((_a$4933 node) (_a$4934 (keyword #f "test")) (_a$4935 (jolt-invoke f (jolt-get node (keyword #f "test")))) (_a$4936 (keyword #f "then")) (_a$4937 (jolt-invoke f (jolt-get node (keyword #f "then")))) (_a$4938 (keyword #f "else")) (_a$4939 (jolt-invoke f (jolt-get node (keyword #f "else"))))) (jolt-assoc _a$4933 _a$4934 _a$4935 _a$4936 _a$4937 _a$4938 _a$4939)) (if (jolt= op (keyword #f "do")) (let* ((_a$4940 node) (_a$4941 (keyword #f "statements")) (_a$4942 (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "statements")))) (_a$4943 (keyword #f "ret")) (_a$4944 (jolt-invoke f (jolt-get node (keyword #f "ret"))))) (jolt-assoc _a$4940 _a$4941 _a$4942 _a$4943 _a$4944)) (if (jolt= op (keyword #f "throw")) (jolt-assoc node (keyword #f "expr") (jolt-invoke f (jolt-get node (keyword #f "expr")))) (if (jolt= op (keyword #f "coerce")) (jolt-assoc node (keyword #f "expr") (jolt-invoke f (jolt-get node (keyword #f "expr")))) (if (jolt= op (keyword #f "set-var")) (jolt-assoc node (keyword #f "val") (jolt-invoke f (jolt-get node (keyword #f "val")))) (if (jolt= op (keyword #f "set-field")) (let* ((_a$4945 node) (_a$4946 (keyword #f "obj")) (_a$4947 (jolt-invoke f (jolt-get node (keyword #f "obj")))) (_a$4948 (keyword #f "val")) (_a$4949 (jolt-invoke f (jolt-get node (keyword #f "val"))))) (jolt-assoc _a$4945 _a$4946 _a$4947 _a$4948 _a$4949)) (if (jolt= op (keyword #f "defmacro")) (jolt-assoc node (keyword #f "fn") (jolt-invoke f (jolt-get node (keyword #f "fn")))) (if (jolt= op (keyword #f "ffi-callable")) (jolt-assoc node (keyword #f "fn") (jolt-invoke f (jolt-get node (keyword #f "fn")))) (if (jolt= op (keyword #f "invoke")) (let* ((_a$4950 node) (_a$4951 (keyword #f "fn")) (_a$4952 (jolt-invoke f (jolt-get node (keyword #f "fn")))) (_a$4953 (keyword #f "args")) (_a$4954 (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args"))))) (jolt-assoc _a$4950 _a$4951 _a$4952 _a$4953 _a$4954)) (if (jolt= op (keyword #f "vector")) (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "items")))) (if (jolt= op (keyword #f "set")) (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "items")))) (if (jolt= op (keyword #f "map")) (jolt-assoc node (keyword #f "pairs") (let* ((_a$4958 (var-deref "clojure.core" "mapv")) (_a$4959 (lambda (pr) (let fnrec4955 ((pr pr)) (let* ((_o$4956 (jolt-invoke f (jolt-nth pr 0))) (_o$4957 (jolt-invoke f (jolt-nth pr 1)))) (jolt-vector _o$4956 _o$4957))))) (_a$4960 (jolt-get node (keyword #f "pairs")))) (jolt-invoke _a$4958 _a$4959 _a$4960))) (if (jolt= op (keyword #f "let")) (let* ((_a$4967 node) (_a$4968 (keyword #f "bindings")) (_a$4969 (let* ((_a$4964 (var-deref "clojure.core" "mapv")) (_a$4965 (lambda (b) (let fnrec4961 ((b b)) (let* ((_o$4962 (jolt-nth b 0)) (_o$4963 (jolt-invoke f (jolt-nth b 1)))) (jolt-vector _o$4962 _o$4963))))) (_a$4966 (jolt-get node (keyword #f "bindings")))) (jolt-invoke _a$4964 _a$4965 _a$4966))) (_a$4970 (keyword #f "body")) (_a$4971 (jolt-invoke f (jolt-get node (keyword #f "body"))))) (jolt-assoc _a$4967 _a$4968 _a$4969 _a$4970 _a$4971)) (if (jolt= op (keyword #f "loop")) (let* ((_a$4978 node) (_a$4979 (keyword #f "bindings")) (_a$4980 (let* ((_a$4975 (var-deref "clojure.core" "mapv")) (_a$4976 (lambda (b) (let fnrec4972 ((b b)) (let* ((_o$4973 (jolt-nth b 0)) (_o$4974 (jolt-invoke f (jolt-nth b 1)))) (jolt-vector _o$4973 _o$4974))))) (_a$4977 (jolt-get node (keyword #f "bindings")))) (jolt-invoke _a$4975 _a$4976 _a$4977))) (_a$4981 (keyword #f "body")) (_a$4982 (jolt-invoke f (jolt-get node (keyword #f "body"))))) (jolt-assoc _a$4978 _a$4979 _a$4980 _a$4981 _a$4982)) (if (jolt= op (keyword #f "recur")) (jolt-assoc node (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args")))) (if (jolt= op (keyword #f "fn")) (jolt-assoc node (keyword #f "arities") (let* ((_a$4984 (var-deref "clojure.core" "mapv")) (_a$4985 (lambda (a) (let fnrec4983 ((a a)) (jolt-assoc a (keyword #f "body") (jolt-invoke f (jolt-get a (keyword #f "body"))))))) (_a$4986 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$4984 _a$4985 _a$4986))) (if (jolt= op (keyword #f "def")) (jolt-assoc node (keyword #f "init") (jolt-invoke f (jolt-get node (keyword #f "init")))) (if (jolt= op (keyword #f "host-call")) (let* ((_a$4987 node) (_a$4988 (keyword #f "target")) (_a$4989 (jolt-invoke f (jolt-get node (keyword #f "target")))) (_a$4990 (keyword #f "args")) (_a$4991 (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args"))))) (jolt-assoc _a$4987 _a$4988 _a$4989 _a$4990 _a$4991)) (if (jolt= op (keyword #f "host-new")) (jolt-assoc node (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args")))) (if (jolt= op (keyword #f "try")) (let* ((n (jolt-assoc node (keyword #f "body") (jolt-invoke f (jolt-get node (keyword #f "body"))))) (n (if (jolt-truthy? (jolt-get node (keyword #f "catch-body"))) (jolt-assoc n (keyword #f "catch-body") (jolt-invoke f (jolt-get node (keyword #f "catch-body")))) n)) (n (if (jolt-truthy? (jolt-get node (keyword #f "finally"))) (jolt-assoc n (keyword #f "finally") (jolt-invoke f (jolt-get node (keyword #f "finally")))) n))) n) (if (jolt-truthy? (keyword #f "else")) node jolt-nil)))))))))))))))))))))))))) map-ir-children))) + (def-var! "jolt.ir" "map-ir-children" (letrec ((map-ir-children (lambda (f node) (let fnrec4934 ((f f) (node node)) (let* ((op (jolt-get node (keyword #f "op")))) (if (jolt= op (keyword #f "if")) (let* ((_a$4935 node) (_a$4936 (keyword #f "test")) (_a$4937 (jolt-invoke f (jolt-get node (keyword #f "test")))) (_a$4938 (keyword #f "then")) (_a$4939 (jolt-invoke f (jolt-get node (keyword #f "then")))) (_a$4940 (keyword #f "else")) (_a$4941 (jolt-invoke f (jolt-get node (keyword #f "else"))))) (jolt-assoc _a$4935 _a$4936 _a$4937 _a$4938 _a$4939 _a$4940 _a$4941)) (if (jolt= op (keyword #f "do")) (let* ((_a$4942 node) (_a$4943 (keyword #f "statements")) (_a$4944 (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "statements")))) (_a$4945 (keyword #f "ret")) (_a$4946 (jolt-invoke f (jolt-get node (keyword #f "ret"))))) (jolt-assoc _a$4942 _a$4943 _a$4944 _a$4945 _a$4946)) (if (jolt= op (keyword #f "throw")) (jolt-assoc node (keyword #f "expr") (jolt-invoke f (jolt-get node (keyword #f "expr")))) (if (jolt= op (keyword #f "coerce")) (jolt-assoc node (keyword #f "expr") (jolt-invoke f (jolt-get node (keyword #f "expr")))) (if (jolt= op (keyword #f "set-var")) (jolt-assoc node (keyword #f "val") (jolt-invoke f (jolt-get node (keyword #f "val")))) (if (jolt= op (keyword #f "set-field")) (let* ((_a$4947 node) (_a$4948 (keyword #f "obj")) (_a$4949 (jolt-invoke f (jolt-get node (keyword #f "obj")))) (_a$4950 (keyword #f "val")) (_a$4951 (jolt-invoke f (jolt-get node (keyword #f "val"))))) (jolt-assoc _a$4947 _a$4948 _a$4949 _a$4950 _a$4951)) (if (jolt= op (keyword #f "defmacro")) (jolt-assoc node (keyword #f "fn") (jolt-invoke f (jolt-get node (keyword #f "fn")))) (if (jolt= op (keyword #f "ffi-callable")) (jolt-assoc node (keyword #f "fn") (jolt-invoke f (jolt-get node (keyword #f "fn")))) (if (jolt= op (keyword #f "invoke")) (let* ((_a$4952 node) (_a$4953 (keyword #f "fn")) (_a$4954 (jolt-invoke f (jolt-get node (keyword #f "fn")))) (_a$4955 (keyword #f "args")) (_a$4956 (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args"))))) (jolt-assoc _a$4952 _a$4953 _a$4954 _a$4955 _a$4956)) (if (jolt= op (keyword #f "vector")) (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "items")))) (if (jolt= op (keyword #f "set")) (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "items")))) (if (jolt= op (keyword #f "map")) (jolt-assoc node (keyword #f "pairs") (let* ((_a$4960 (var-deref "clojure.core" "mapv")) (_a$4961 (lambda (pr) (let fnrec4957 ((pr pr)) (let* ((_o$4958 (jolt-invoke f (jolt-nth pr 0))) (_o$4959 (jolt-invoke f (jolt-nth pr 1)))) (jolt-vector _o$4958 _o$4959))))) (_a$4962 (jolt-get node (keyword #f "pairs")))) (jolt-invoke _a$4960 _a$4961 _a$4962))) (if (jolt= op (keyword #f "let")) (let* ((_a$4969 node) (_a$4970 (keyword #f "bindings")) (_a$4971 (let* ((_a$4966 (var-deref "clojure.core" "mapv")) (_a$4967 (lambda (b) (let fnrec4963 ((b b)) (let* ((_o$4964 (jolt-nth b 0)) (_o$4965 (jolt-invoke f (jolt-nth b 1)))) (jolt-vector _o$4964 _o$4965))))) (_a$4968 (jolt-get node (keyword #f "bindings")))) (jolt-invoke _a$4966 _a$4967 _a$4968))) (_a$4972 (keyword #f "body")) (_a$4973 (jolt-invoke f (jolt-get node (keyword #f "body"))))) (jolt-assoc _a$4969 _a$4970 _a$4971 _a$4972 _a$4973)) (if (jolt= op (keyword #f "loop")) (let* ((_a$4980 node) (_a$4981 (keyword #f "bindings")) (_a$4982 (let* ((_a$4977 (var-deref "clojure.core" "mapv")) (_a$4978 (lambda (b) (let fnrec4974 ((b b)) (let* ((_o$4975 (jolt-nth b 0)) (_o$4976 (jolt-invoke f (jolt-nth b 1)))) (jolt-vector _o$4975 _o$4976))))) (_a$4979 (jolt-get node (keyword #f "bindings")))) (jolt-invoke _a$4977 _a$4978 _a$4979))) (_a$4983 (keyword #f "body")) (_a$4984 (jolt-invoke f (jolt-get node (keyword #f "body"))))) (jolt-assoc _a$4980 _a$4981 _a$4982 _a$4983 _a$4984)) (if (jolt= op (keyword #f "recur")) (jolt-assoc node (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args")))) (if (jolt= op (keyword #f "fn")) (jolt-assoc node (keyword #f "arities") (let* ((_a$4986 (var-deref "clojure.core" "mapv")) (_a$4987 (lambda (a) (let fnrec4985 ((a a)) (jolt-assoc a (keyword #f "body") (jolt-invoke f (jolt-get a (keyword #f "body"))))))) (_a$4988 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$4986 _a$4987 _a$4988))) (if (jolt= op (keyword #f "def")) (jolt-assoc node (keyword #f "init") (jolt-invoke f (jolt-get node (keyword #f "init")))) (if (jolt= op (keyword #f "host-call")) (let* ((_a$4989 node) (_a$4990 (keyword #f "target")) (_a$4991 (jolt-invoke f (jolt-get node (keyword #f "target")))) (_a$4992 (keyword #f "args")) (_a$4993 (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args"))))) (jolt-assoc _a$4989 _a$4990 _a$4991 _a$4992 _a$4993)) (if (jolt= op (keyword #f "host-new")) (jolt-assoc node (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") f (jolt-get node (keyword #f "args")))) (if (jolt= op (keyword #f "try")) (let* ((n (jolt-assoc node (keyword #f "body") (jolt-invoke f (jolt-get node (keyword #f "body"))))) (n (if (jolt-truthy? (jolt-get node (keyword #f "catch-body"))) (jolt-assoc n (keyword #f "catch-body") (jolt-invoke f (jolt-get node (keyword #f "catch-body")))) n)) (n (if (jolt-truthy? (jolt-get node (keyword #f "finally"))) (jolt-assoc n (keyword #f "finally") (jolt-invoke f (jolt-get node (keyword #f "finally")))) n))) n) (if (jolt-truthy? (keyword #f "else")) node jolt-nil)))))))))))))))))))))))))) map-ir-children))) (guard (e (#t #f)) - (def-var! "jolt.ir" "reduce-ir-children" (letrec ((reduce-ir-children (lambda (f acc node) (let fnrec4992 ((f f) (acc acc) (node node)) (let* ((op (jolt-get node (keyword #f "op")))) (if (jolt= op (keyword #f "if")) (let* ((_a$4996 f) (_a$4997 (let* ((_a$4993 f) (_a$4994 (jolt-invoke f acc (jolt-get node (keyword #f "test")))) (_a$4995 (jolt-get node (keyword #f "then")))) (jolt-invoke _a$4993 _a$4994 _a$4995))) (_a$4998 (jolt-get node (keyword #f "else")))) (jolt-invoke _a$4996 _a$4997 _a$4998)) (if (jolt= op (keyword #f "do")) (let* ((_a$4999 f) (_a$5000 (jolt-reduce f acc (jolt-get node (keyword #f "statements")))) (_a$5001 (jolt-get node (keyword #f "ret")))) (jolt-invoke _a$4999 _a$5000 _a$5001)) (if (jolt= op (keyword #f "throw")) (jolt-invoke f acc (jolt-get node (keyword #f "expr"))) (if (jolt= op (keyword #f "coerce")) (jolt-invoke f acc (jolt-get node (keyword #f "expr"))) (if (jolt= op (keyword #f "set-var")) (jolt-invoke f acc (jolt-get node (keyword #f "val"))) (if (jolt= op (keyword #f "set-field")) (let* ((_a$5002 f) (_a$5003 (jolt-invoke f acc (jolt-get node (keyword #f "obj")))) (_a$5004 (jolt-get node (keyword #f "val")))) (jolt-invoke _a$5002 _a$5003 _a$5004)) (if (jolt= op (keyword #f "defmacro")) (jolt-invoke f acc (jolt-get node (keyword #f "fn"))) (if (jolt= op (keyword #f "ffi-callable")) (jolt-invoke f acc (jolt-get node (keyword #f "fn"))) (if (jolt= op (keyword #f "invoke")) (let* ((_a$5005 f) (_a$5006 (jolt-invoke f acc (jolt-get node (keyword #f "fn")))) (_a$5007 (jolt-get node (keyword #f "args")))) (jolt-reduce _a$5005 _a$5006 _a$5007)) (if (jolt= op (keyword #f "vector")) (jolt-reduce f acc (jolt-get node (keyword #f "items"))) (if (jolt= op (keyword #f "set")) (jolt-reduce f acc (jolt-get node (keyword #f "items"))) (if (jolt= op (keyword #f "map")) (let* ((_a$5012 (lambda (a pr) (let fnrec5008 ((a a) (pr pr)) (let* ((_a$5009 f) (_a$5010 (jolt-invoke f a (jolt-nth pr 0))) (_a$5011 (jolt-nth pr 1))) (jolt-invoke _a$5009 _a$5010 _a$5011))))) (_a$5013 acc) (_a$5014 (jolt-get node (keyword #f "pairs")))) (jolt-reduce _a$5012 _a$5013 _a$5014)) (if (jolt= op (keyword #f "let")) (let* ((_a$5019 f) (_a$5020 (let* ((_a$5016 (lambda (a b) (let fnrec5015 ((a a) (b b)) (jolt-invoke f a (jolt-nth b 1))))) (_a$5017 acc) (_a$5018 (jolt-get node (keyword #f "bindings")))) (jolt-reduce _a$5016 _a$5017 _a$5018))) (_a$5021 (jolt-get node (keyword #f "body")))) (jolt-invoke _a$5019 _a$5020 _a$5021)) (if (jolt= op (keyword #f "loop")) (let* ((_a$5026 f) (_a$5027 (let* ((_a$5023 (lambda (a b) (let fnrec5022 ((a a) (b b)) (jolt-invoke f a (jolt-nth b 1))))) (_a$5024 acc) (_a$5025 (jolt-get node (keyword #f "bindings")))) (jolt-reduce _a$5023 _a$5024 _a$5025))) (_a$5028 (jolt-get node (keyword #f "body")))) (jolt-invoke _a$5026 _a$5027 _a$5028)) (if (jolt= op (keyword #f "recur")) (jolt-reduce f acc (jolt-get node (keyword #f "args"))) (if (jolt= op (keyword #f "fn")) (let* ((_a$5030 (lambda (a ar) (let fnrec5029 ((a a) (ar ar)) (jolt-invoke f a (jolt-get ar (keyword #f "body")))))) (_a$5031 acc) (_a$5032 (jolt-get node (keyword #f "arities")))) (jolt-reduce _a$5030 _a$5031 _a$5032)) (if (jolt= op (keyword #f "def")) (if (jolt-truthy? (jolt-get node (keyword #f "init"))) (jolt-invoke f acc (jolt-get node (keyword #f "init"))) acc) (if (jolt= op (keyword #f "host-call")) (let* ((_a$5033 f) (_a$5034 (jolt-invoke f acc (jolt-get node (keyword #f "target")))) (_a$5035 (jolt-get node (keyword #f "args")))) (jolt-reduce _a$5033 _a$5034 _a$5035)) (if (jolt= op (keyword #f "host-new")) (jolt-reduce f acc (jolt-get node (keyword #f "args"))) (if (jolt= op (keyword #f "try")) (let* ((a (jolt-invoke f acc (jolt-get node (keyword #f "body")))) (a (if (jolt-truthy? (jolt-get node (keyword #f "catch-body"))) (jolt-invoke f a (jolt-get node (keyword #f "catch-body"))) a)) (a (if (jolt-truthy? (jolt-get node (keyword #f "finally"))) (jolt-invoke f a (jolt-get node (keyword #f "finally"))) a))) a) (if (jolt-truthy? (keyword #f "else")) acc jolt-nil)))))))))))))))))))))))))) reduce-ir-children))) + (def-var! "jolt.ir" "reduce-ir-children" (letrec ((reduce-ir-children (lambda (f acc node) (let fnrec4994 ((f f) (acc acc) (node node)) (let* ((op (jolt-get node (keyword #f "op")))) (if (jolt= op (keyword #f "if")) (let* ((_a$4998 f) (_a$4999 (let* ((_a$4995 f) (_a$4996 (jolt-invoke f acc (jolt-get node (keyword #f "test")))) (_a$4997 (jolt-get node (keyword #f "then")))) (jolt-invoke _a$4995 _a$4996 _a$4997))) (_a$5000 (jolt-get node (keyword #f "else")))) (jolt-invoke _a$4998 _a$4999 _a$5000)) (if (jolt= op (keyword #f "do")) (let* ((_a$5001 f) (_a$5002 (jolt-reduce f acc (jolt-get node (keyword #f "statements")))) (_a$5003 (jolt-get node (keyword #f "ret")))) (jolt-invoke _a$5001 _a$5002 _a$5003)) (if (jolt= op (keyword #f "throw")) (jolt-invoke f acc (jolt-get node (keyword #f "expr"))) (if (jolt= op (keyword #f "coerce")) (jolt-invoke f acc (jolt-get node (keyword #f "expr"))) (if (jolt= op (keyword #f "set-var")) (jolt-invoke f acc (jolt-get node (keyword #f "val"))) (if (jolt= op (keyword #f "set-field")) (let* ((_a$5004 f) (_a$5005 (jolt-invoke f acc (jolt-get node (keyword #f "obj")))) (_a$5006 (jolt-get node (keyword #f "val")))) (jolt-invoke _a$5004 _a$5005 _a$5006)) (if (jolt= op (keyword #f "defmacro")) (jolt-invoke f acc (jolt-get node (keyword #f "fn"))) (if (jolt= op (keyword #f "ffi-callable")) (jolt-invoke f acc (jolt-get node (keyword #f "fn"))) (if (jolt= op (keyword #f "invoke")) (let* ((_a$5007 f) (_a$5008 (jolt-invoke f acc (jolt-get node (keyword #f "fn")))) (_a$5009 (jolt-get node (keyword #f "args")))) (jolt-reduce _a$5007 _a$5008 _a$5009)) (if (jolt= op (keyword #f "vector")) (jolt-reduce f acc (jolt-get node (keyword #f "items"))) (if (jolt= op (keyword #f "set")) (jolt-reduce f acc (jolt-get node (keyword #f "items"))) (if (jolt= op (keyword #f "map")) (let* ((_a$5014 (lambda (a pr) (let fnrec5010 ((a a) (pr pr)) (let* ((_a$5011 f) (_a$5012 (jolt-invoke f a (jolt-nth pr 0))) (_a$5013 (jolt-nth pr 1))) (jolt-invoke _a$5011 _a$5012 _a$5013))))) (_a$5015 acc) (_a$5016 (jolt-get node (keyword #f "pairs")))) (jolt-reduce _a$5014 _a$5015 _a$5016)) (if (jolt= op (keyword #f "let")) (let* ((_a$5021 f) (_a$5022 (let* ((_a$5018 (lambda (a b) (let fnrec5017 ((a a) (b b)) (jolt-invoke f a (jolt-nth b 1))))) (_a$5019 acc) (_a$5020 (jolt-get node (keyword #f "bindings")))) (jolt-reduce _a$5018 _a$5019 _a$5020))) (_a$5023 (jolt-get node (keyword #f "body")))) (jolt-invoke _a$5021 _a$5022 _a$5023)) (if (jolt= op (keyword #f "loop")) (let* ((_a$5028 f) (_a$5029 (let* ((_a$5025 (lambda (a b) (let fnrec5024 ((a a) (b b)) (jolt-invoke f a (jolt-nth b 1))))) (_a$5026 acc) (_a$5027 (jolt-get node (keyword #f "bindings")))) (jolt-reduce _a$5025 _a$5026 _a$5027))) (_a$5030 (jolt-get node (keyword #f "body")))) (jolt-invoke _a$5028 _a$5029 _a$5030)) (if (jolt= op (keyword #f "recur")) (jolt-reduce f acc (jolt-get node (keyword #f "args"))) (if (jolt= op (keyword #f "fn")) (let* ((_a$5032 (lambda (a ar) (let fnrec5031 ((a a) (ar ar)) (jolt-invoke f a (jolt-get ar (keyword #f "body")))))) (_a$5033 acc) (_a$5034 (jolt-get node (keyword #f "arities")))) (jolt-reduce _a$5032 _a$5033 _a$5034)) (if (jolt= op (keyword #f "def")) (if (jolt-truthy? (jolt-get node (keyword #f "init"))) (jolt-invoke f acc (jolt-get node (keyword #f "init"))) acc) (if (jolt= op (keyword #f "host-call")) (let* ((_a$5035 f) (_a$5036 (jolt-invoke f acc (jolt-get node (keyword #f "target")))) (_a$5037 (jolt-get node (keyword #f "args")))) (jolt-reduce _a$5035 _a$5036 _a$5037)) (if (jolt= op (keyword #f "host-new")) (jolt-reduce f acc (jolt-get node (keyword #f "args"))) (if (jolt= op (keyword #f "try")) (let* ((a (jolt-invoke f acc (jolt-get node (keyword #f "body")))) (a (if (jolt-truthy? (jolt-get node (keyword #f "catch-body"))) (jolt-invoke f a (jolt-get node (keyword #f "catch-body"))) a)) (a (if (jolt-truthy? (jolt-get node (keyword #f "finally"))) (jolt-invoke f a (jolt-get node (keyword #f "finally"))) a))) a) (if (jolt-truthy? (keyword #f "else")) acc jolt-nil)))))))))))))))))))))))))) reduce-ir-children))) (guard (e (#t #f)) (declare-var! "jolt.analyzer" "analyze")) (guard (e (#t #f)) - (def-var-with-meta! "jolt.analyzer" "handled" (let* ((_o$5036 "quote") (_o$5037 "if") (_o$5038 "do") (_o$5039 "def") (_o$5040 "fn*") (_o$5041 "let*") (_o$5042 "loop*") (_o$5043 "recur") (_o$5044 "throw") (_o$5045 "try") (_o$5046 "syntax-quote") (_o$5047 "var") (_o$5048 "letfn") (_o$5049 "set!") (_o$5050 "defmacro")) (jolt-hash-set _o$5036 _o$5037 _o$5038 _o$5039 _o$5040 _o$5041 _o$5042 _o$5043 _o$5044 _o$5045 _o$5046 _o$5047 _o$5048 _o$5049 _o$5050)) (jolt-hash-map (keyword #f "private") #t))) + (def-var-with-meta! "jolt.analyzer" "handled" (let* ((_o$5038 "quote") (_o$5039 "if") (_o$5040 "do") (_o$5041 "def") (_o$5042 "fn*") (_o$5043 "let*") (_o$5044 "loop*") (_o$5045 "recur") (_o$5046 "throw") (_o$5047 "try") (_o$5048 "syntax-quote") (_o$5049 "var") (_o$5050 "letfn") (_o$5051 "set!") (_o$5052 "defmacro")) (jolt-hash-set _o$5038 _o$5039 _o$5040 _o$5041 _o$5042 _o$5043 _o$5044 _o$5045 _o$5046 _o$5047 _o$5048 _o$5049 _o$5050 _o$5051 _o$5052)) (jolt-hash-map (keyword #f "private") #t))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "uncompilable" (letrec ((uncompilable (lambda (why) (let fnrec5051 ((why why)) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "jolt/uncompilable: " why)))))) uncompilable))) + (def-var! "jolt.analyzer" "uncompilable" (letrec ((uncompilable (lambda (why) (let fnrec5053 ((why why)) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "jolt/uncompilable: " why)))))) uncompilable))) (guard (e (#t #f)) (def-var-with-meta! "jolt.analyzer" "gensym-counter" (jolt-invoke (var-deref "clojure.core" "atom") 0) (jolt-hash-map (keyword #f "private") #t))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "gen-name" (letrec ((gen-name (lambda (prefix) (let fnrec5052 ((prefix prefix)) (let* ((n (jolt-invoke (var-deref "clojure.core" "deref") (var-deref "jolt.analyzer" "gensym-counter")))) (begin (jolt-invoke (var-deref "clojure.core" "swap!") (var-deref "jolt.analyzer" "gensym-counter") jolt-inc) (jolt-invoke (var-deref "clojure.core" "str") "_r$" prefix n))))))) gen-name))) + (def-var! "jolt.analyzer" "gen-name" (letrec ((gen-name (lambda (prefix) (let fnrec5054 ((prefix prefix)) (let* ((n (jolt-invoke (var-deref "clojure.core" "deref") (var-deref "jolt.analyzer" "gensym-counter")))) (begin (jolt-invoke (var-deref "clojure.core" "swap!") (var-deref "jolt.analyzer" "gensym-counter") jolt-inc) (jolt-invoke (var-deref "clojure.core" "str") "_r$" prefix n))))))) gen-name))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "empty-env" (letrec ((empty-env (lambda () (let fnrec5053 () (let* ((_o$5054 (keyword #f "locals")) (_o$5055 (jolt-hash-set)) (_o$5056 (keyword #f "hints")) (_o$5057 (jolt-hash-map))) (jolt-hash-map _o$5054 _o$5055 _o$5056 _o$5057)))))) empty-env))) + (def-var! "jolt.analyzer" "empty-env" (letrec ((empty-env (lambda () (let fnrec5055 () (let* ((_o$5056 (keyword #f "locals")) (_o$5057 (jolt-hash-set)) (_o$5058 (keyword #f "hints")) (_o$5059 (jolt-hash-map))) (jolt-hash-map _o$5056 _o$5057 _o$5058 _o$5059)))))) empty-env))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "local?" (letrec ((local? (lambda (env nm) (let fnrec5058 ((env env) (nm nm)) (jolt-contains? (jolt-get env (keyword #f "locals")) nm))))) local?))) + (def-var! "jolt.analyzer" "local?" (letrec ((local? (lambda (env nm) (let fnrec5060 ((env env) (nm nm)) (jolt-contains? (jolt-get env (keyword #f "locals")) nm))))) local?))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "add-locals" (letrec ((add-locals (lambda (env names) (let fnrec5059 ((env env) (names names)) (jolt-invoke (var-deref "clojure.core" "update") env (keyword #f "locals") (lambda (p__47_) (let fnrec5060 ((p__47_ p__47_)) (jolt-reduce jolt-conj p__47_ names)))))))) add-locals))) + (def-var! "jolt.analyzer" "add-locals" (letrec ((add-locals (lambda (env names) (let fnrec5061 ((env env) (names names)) (jolt-invoke (var-deref "clojure.core" "update") env (keyword #f "locals") (lambda (p__47_) (let fnrec5062 ((p__47_ p__47_)) (jolt-reduce jolt-conj p__47_ names)))))))) add-locals))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "with-recur" (letrec ((with-recur (lambda (env name) (let fnrec5061 ((env env) (name name)) (jolt-assoc env (keyword #f "recur") name))))) with-recur))) + (def-var! "jolt.analyzer" "with-recur" (letrec ((with-recur (lambda (env name) (let fnrec5063 ((env env) (name name)) (jolt-assoc env (keyword #f "recur") name))))) with-recur))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "hint-of" (letrec ((hint-of (lambda (ctx sym) (let fnrec5062 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "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__13__auto t)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "record-type?") ctx t) and__13__auto))) (keyword #f "struct") jolt-nil)) jolt-nil)))))))) hint-of))) + (def-var! "jolt.analyzer" "hint-of" (letrec ((hint-of (lambda (ctx sym) (let fnrec5064 ((ctx ctx) (sym sym)) (let* ((m (jolt-invoke (var-deref "jolt.host" "form-sym-meta") sym))) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "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__13__auto t)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "record-type?") ctx t) and__13__auto))) (keyword #f "struct") jolt-nil)) jolt-nil)))))))) hint-of))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "add-hint" (letrec ((add-hint (lambda (env nm h) (let fnrec5063 ((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))) + (def-var! "jolt.analyzer" "add-hint" (letrec ((add-hint (lambda (env nm h) (let fnrec5065 ((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))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "phint-of" (letrec ((phint-of (lambda (ctx sym) (let fnrec5064 ((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))) + (def-var! "jolt.analyzer" "phint-of" (letrec ((phint-of (lambda (ctx sym) (let fnrec5066 ((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))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "tag->nkind" (letrec ((tag->nkind (lambda (t) (let fnrec5065 ((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))) + (def-var! "jolt.analyzer" "tag->nkind" (letrec ((tag->nkind (lambda (t) (let fnrec5067 ((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))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "nhint-of" (letrec ((nhint-of (lambda (ctx sym) (let fnrec5066 ((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))) + (def-var! "jolt.analyzer" "nhint-of" (letrec ((nhint-of (lambda (ctx sym) (let fnrec5068 ((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))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "with-ret-nhint" (letrec ((with-ret-nhint (lambda (node kind) (let fnrec5067 ((node node) (kind kind)) (if (jolt-truthy? (let* ((and__13__auto kind)) (if (jolt-truthy? and__13__auto) (jolt= (keyword #f "fn") (jolt-get node (keyword #f "op"))) and__13__auto))) (jolt-assoc node (keyword #f "arities") (let* ((_a$5069 (var-deref "clojure.core" "mapv")) (_a$5070 (lambda (a) (let fnrec5068 ((a a)) (if (jolt-truthy? (jolt-get a (keyword #f "ret-nhint"))) a (jolt-assoc a (keyword #f "ret-nhint") kind))))) (_a$5071 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$5069 _a$5070 _a$5071))) node))))) with-ret-nhint))) + (def-var! "jolt.analyzer" "with-ret-nhint" (letrec ((with-ret-nhint (lambda (node kind) (let fnrec5069 ((node node) (kind kind)) (if (jolt-truthy? (let* ((and__13__auto kind)) (if (jolt-truthy? and__13__auto) (jolt= (keyword #f "fn") (jolt-get node (keyword #f "op"))) and__13__auto))) (jolt-assoc node (keyword #f "arities") (let* ((_a$5071 (var-deref "clojure.core" "mapv")) (_a$5072 (lambda (a) (let fnrec5070 ((a a)) (if (jolt-truthy? (jolt-get a (keyword #f "ret-nhint"))) a (jolt-assoc a (keyword #f "ret-nhint") kind))))) (_a$5073 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$5071 _a$5072 _a$5073))) node))))) with-ret-nhint))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-seq" (letrec ((analyze-seq (lambda (ctx forms env) (let fnrec5072 ((ctx ctx) (forms forms) (env env)) (let* ((v (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__48_) (let fnrec5073 ((p__48_ p__48_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__48_ 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$5074 (var-deref "jolt.ir" "do-node")) (_a$5075 (jolt-invoke (var-deref "clojure.core" "subvec") v 0 (jolt-dec n))) (_a$5076 (jolt-peek v))) (jolt-invoke _a$5074 _a$5075 _a$5076)) jolt-nil)))))))) analyze-seq))) + (def-var! "jolt.analyzer" "analyze-seq" (letrec ((analyze-seq (lambda (ctx forms env) (let fnrec5074 ((ctx ctx) (forms forms) (env env)) (let* ((v (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__48_) (let fnrec5075 ((p__48_ p__48_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__48_ 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$5076 (var-deref "jolt.ir" "do-node")) (_a$5077 (jolt-invoke (var-deref "clojure.core" "subvec") v 0 (jolt-dec n))) (_a$5078 (jolt-peek v))) (jolt-invoke _a$5076 _a$5077 _a$5078)) jolt-nil)))))))) analyze-seq))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-bindings" (letrec ((analyze-bindings (lambda (ctx bvec env) (let fnrec5077 ((ctx ctx) (bvec bvec) (env env)) (let* ((i 0) (env env) (pairs (jolt-vector))) (let loop5078 ((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$5085 (+ i 2)) (_a$5086 (let* ((_a$5079 (var-deref "jolt.analyzer" "add-hint")) (_a$5080 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector nm))) (_a$5081 nm) (_a$5082 (jolt-invoke (var-deref "jolt.analyzer" "hint-of") ctx bsym))) (jolt-invoke _a$5079 _a$5080 _a$5081 _a$5082))) (_a$5087 (jolt-conj pairs (let* ((_o$5083 nm) (_o$5084 init)) (jolt-vector _o$5083 _o$5084))))) (loop5078 _a$5085 _a$5086 _a$5087))))) (let* ((_o$5088 pairs) (_o$5089 env)) (jolt-vector _o$5088 _o$5089))))))))) analyze-bindings))) + (def-var! "jolt.analyzer" "analyze-bindings" (letrec ((analyze-bindings (lambda (ctx bvec env) (let fnrec5079 ((ctx ctx) (bvec bvec) (env env)) (let* ((i 0) (env env) (pairs (jolt-vector))) (let loop5080 ((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$5087 (+ i 2)) (_a$5088 (let* ((_a$5081 (var-deref "jolt.analyzer" "add-hint")) (_a$5082 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector nm))) (_a$5083 nm) (_a$5084 (jolt-invoke (var-deref "jolt.analyzer" "hint-of") ctx bsym))) (jolt-invoke _a$5081 _a$5082 _a$5083 _a$5084))) (_a$5089 (jolt-conj pairs (let* ((_o$5085 nm) (_o$5086 init)) (jolt-vector _o$5085 _o$5086))))) (loop5080 _a$5087 _a$5088 _a$5089))))) (let* ((_o$5090 pairs) (_o$5091 env)) (jolt-vector _o$5090 _o$5091))))))))) analyze-bindings))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "parse-params" (letrec ((parse-params (lambda (ctx pvec) (let fnrec5090 ((ctx ctx) (pvec pvec)) (let* ((i 0) (fixed (jolt-vector)) (rest-name jolt-nil) (hints (jolt-vector)) (phints (jolt-vector)) (nhints (jolt-vector))) (let loop5091 ((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$5092 (+ i 2)) (_a$5093 fixed) (_a$5094 (jolt-invoke (var-deref "jolt.host" "form-sym-name") r)) (_a$5095 hints) (_a$5096 phints) (_a$5097 nhints)) (loop5091 _a$5092 _a$5093 _a$5094 _a$5095 _a$5096 _a$5097)))) (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$5104 (jolt-inc i)) (_a$5105 (jolt-conj fixed nm)) (_a$5106 rest-name) (_a$5107 (if (jolt-truthy? h) (jolt-conj hints (let* ((_o$5098 nm) (_o$5099 h)) (jolt-vector _o$5098 _o$5099))) hints)) (_a$5108 (if (jolt-truthy? ph) (jolt-conj phints (let* ((_o$5100 nm) (_o$5101 ph)) (jolt-vector _o$5100 _o$5101))) phints)) (_a$5109 (if (jolt-truthy? nh) (jolt-conj nhints (let* ((_o$5102 nm) (_o$5103 nh)) (jolt-vector _o$5102 _o$5103))) nhints))) (loop5091 _a$5104 _a$5105 _a$5106 _a$5107 _a$5108 _a$5109)))))) (let* ((_o$5110 (keyword #f "fixed")) (_o$5111 fixed) (_o$5112 (keyword #f "rest")) (_o$5113 rest-name) (_o$5114 (keyword #f "hints")) (_o$5115 hints) (_o$5116 (keyword #f "phints")) (_o$5117 phints) (_o$5118 (keyword #f "nhints")) (_o$5119 nhints)) (jolt-hash-map _o$5110 _o$5111 _o$5112 _o$5113 _o$5114 _o$5115 _o$5116 _o$5117 _o$5118 _o$5119))))))))) parse-params))) + (def-var! "jolt.analyzer" "parse-params" (letrec ((parse-params (lambda (ctx pvec) (let fnrec5092 ((ctx ctx) (pvec pvec)) (let* ((i 0) (fixed (jolt-vector)) (rest-name jolt-nil) (hints (jolt-vector)) (phints (jolt-vector)) (nhints (jolt-vector))) (let loop5093 ((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$5094 (+ i 2)) (_a$5095 fixed) (_a$5096 (jolt-invoke (var-deref "jolt.host" "form-sym-name") r)) (_a$5097 hints) (_a$5098 phints) (_a$5099 nhints)) (loop5093 _a$5094 _a$5095 _a$5096 _a$5097 _a$5098 _a$5099)))) (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$5106 (jolt-inc i)) (_a$5107 (jolt-conj fixed nm)) (_a$5108 rest-name) (_a$5109 (if (jolt-truthy? h) (jolt-conj hints (let* ((_o$5100 nm) (_o$5101 h)) (jolt-vector _o$5100 _o$5101))) hints)) (_a$5110 (if (jolt-truthy? ph) (jolt-conj phints (let* ((_o$5102 nm) (_o$5103 ph)) (jolt-vector _o$5102 _o$5103))) phints)) (_a$5111 (if (jolt-truthy? nh) (jolt-conj nhints (let* ((_o$5104 nm) (_o$5105 nh)) (jolt-vector _o$5104 _o$5105))) nhints))) (loop5093 _a$5106 _a$5107 _a$5108 _a$5109 _a$5110 _a$5111)))))) (let* ((_o$5112 (keyword #f "fixed")) (_o$5113 fixed) (_o$5114 (keyword #f "rest")) (_o$5115 rest-name) (_o$5116 (keyword #f "hints")) (_o$5117 hints) (_o$5118 (keyword #f "phints")) (_o$5119 phints) (_o$5120 (keyword #f "nhints")) (_o$5121 nhints)) (jolt-hash-map _o$5112 _o$5113 _o$5114 _o$5115 _o$5116 _o$5117 _o$5118 _o$5119 _o$5120 _o$5121))))))))) parse-params))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "uniquify-params" (letrec ((uniquify-params (lambda (names) (let fnrec5120 ((names names)) (let* ((n (jolt-count names))) (let* ((i 0) (out (jolt-vector))) (let loop5121 ((i i) (out out)) (if (< i n) (let* ((nm (jolt-nth names i)) (dup? (let* ((j (jolt-inc i))) (let loop5122 ((j j)) (if (>= j n) #f (if (jolt= nm (jolt-nth names j)) #t (if (jolt-truthy? (keyword #f "else")) (loop5122 (jolt-inc j)) jolt-nil))))))) (let* ((_a$5123 (jolt-inc i)) (_a$5124 (jolt-conj out (if (jolt-truthy? dup?) (jolt-invoke (var-deref "jolt.analyzer" "gen-name") (jolt-invoke (var-deref "clojure.core" "str") nm "_")) nm)))) (loop5121 _a$5123 _a$5124))) out)))))))) uniquify-params))) + (def-var! "jolt.analyzer" "uniquify-params" (letrec ((uniquify-params (lambda (names) (let fnrec5122 ((names names)) (let* ((n (jolt-count names))) (let* ((i 0) (out (jolt-vector))) (let loop5123 ((i i) (out out)) (if (< i n) (let* ((nm (jolt-nth names i)) (dup? (let* ((j (jolt-inc i))) (let loop5124 ((j j)) (if (>= j n) #f (if (jolt= nm (jolt-nth names j)) #t (if (jolt-truthy? (keyword #f "else")) (loop5124 (jolt-inc j)) jolt-nil))))))) (let* ((_a$5125 (jolt-inc i)) (_a$5126 (jolt-conj out (if (jolt-truthy? dup?) (jolt-invoke (var-deref "jolt.analyzer" "gen-name") (jolt-invoke (var-deref "clojure.core" "str") nm "_")) nm)))) (loop5123 _a$5125 _a$5126))) out)))))))) uniquify-params))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-arity" (letrec ((analyze-arity (lambda (ctx pvec body env fn-name) (let fnrec5125 ((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$5126 (var-deref "clojure.core" "str")) (_a$5127 (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (_a$5128 "/") (_a$5129 (let* ((or__14__auto fn-name)) (if (jolt-truthy? or__14__auto) or__14__auto "fn"))) (_a$5130 "--")) (jolt-invoke _a$5126 _a$5127 _a$5128 _a$5129 _a$5130)))) (names (let* ((G__41 (jolt-invoke (var-deref "clojure.core" "vec") fixed))) (let* ((G__42 (if (jolt-truthy? rst) (jolt-conj G__41 rst) G__41))) (let* ((G__43 (if (jolt-truthy? fn-name) (jolt-conj G__42 fn-name) G__42))) G__43)))) (env0 (jolt-invoke (var-deref "jolt.analyzer" "with-recur") (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names) rname)) (env* (let* ((_a$5136 (lambda (e pr) (let fnrec5131 ((e e) (pr pr)) (let* ((_a$5132 (var-deref "jolt.analyzer" "add-hint")) (_a$5133 e) (_a$5134 (jolt-nth pr 0)) (_a$5135 (jolt-nth pr 1))) (jolt-invoke _a$5132 _a$5133 _a$5134 _a$5135))))) (_a$5137 env0) (_a$5138 (jolt-get pp (keyword #f "hints")))) (jolt-reduce _a$5136 _a$5137 _a$5138))) (arity (let* ((_o$5139 (keyword #f "params")) (_o$5140 fixed) (_o$5141 (keyword #f "recur-name")) (_o$5142 rname) (_o$5143 (keyword #f "body")) (_o$5144 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx body env*))) (jolt-hash-map _o$5139 _o$5140 _o$5141 _o$5142 _o$5143 _o$5144))) (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))) + (def-var! "jolt.analyzer" "analyze-arity" (letrec ((analyze-arity (lambda (ctx pvec body env fn-name) (let fnrec5127 ((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$5128 (var-deref "clojure.core" "str")) (_a$5129 (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx)) (_a$5130 "/") (_a$5131 (let* ((or__14__auto fn-name)) (if (jolt-truthy? or__14__auto) or__14__auto "fn"))) (_a$5132 "--")) (jolt-invoke _a$5128 _a$5129 _a$5130 _a$5131 _a$5132)))) (names (let* ((G__41 (jolt-invoke (var-deref "clojure.core" "vec") fixed))) (let* ((G__42 (if (jolt-truthy? rst) (jolt-conj G__41 rst) G__41))) (let* ((G__43 (if (jolt-truthy? fn-name) (jolt-conj G__42 fn-name) G__42))) G__43)))) (env0 (jolt-invoke (var-deref "jolt.analyzer" "with-recur") (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names) rname)) (env* (let* ((_a$5138 (lambda (e pr) (let fnrec5133 ((e e) (pr pr)) (let* ((_a$5134 (var-deref "jolt.analyzer" "add-hint")) (_a$5135 e) (_a$5136 (jolt-nth pr 0)) (_a$5137 (jolt-nth pr 1))) (jolt-invoke _a$5134 _a$5135 _a$5136 _a$5137))))) (_a$5139 env0) (_a$5140 (jolt-get pp (keyword #f "hints")))) (jolt-reduce _a$5138 _a$5139 _a$5140))) (arity (let* ((_o$5141 (keyword #f "params")) (_o$5142 fixed) (_o$5143 (keyword #f "recur-name")) (_o$5144 rname) (_o$5145 (keyword #f "body")) (_o$5146 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx body env*))) (jolt-hash-map _o$5141 _o$5142 _o$5143 _o$5144 _o$5145 _o$5146))) (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))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "strip-arglist-meta" (letrec ((strip-arglist-meta (lambda (form) (let fnrec5145 ((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__13__auto (jolt= 3 (jolt-count es)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first es)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "with-meta" (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first es))))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-vec?") (jolt-nth es 1)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-nth es 1) form)) form))))) strip-arglist-meta))) + (def-var! "jolt.analyzer" "strip-arglist-meta" (letrec ((strip-arglist-meta (lambda (form) (let fnrec5147 ((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__13__auto (jolt= 3 (jolt-count es)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-first es)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "with-meta" (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first es))))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-vec?") (jolt-nth es 1)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-nth es 1) form)) form))))) strip-arglist-meta))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-fn" (letrec ((analyze-fn (lambda (ctx items env) (let fnrec5146 ((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 fnrec5147 ((clause clause)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") clause)))) (let* ((_a$5148 (var-deref "jolt.analyzer" "analyze-arity")) (_a$5149 ctx) (_a$5150 (jolt-invoke (var-deref "jolt.analyzer" "strip-arglist-meta") (jolt-first cl))) (_a$5151 (jolt-rest cl)) (_a$5152 env) (_a$5153 fn-name)) (jolt-invoke _a$5148 _a$5149 _a$5150 _a$5151 _a$5152 _a$5153))))) rest-items)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "fn: bad params") jolt-nil)))))))) analyze-fn))) + (def-var! "jolt.analyzer" "analyze-fn" (letrec ((analyze-fn (lambda (ctx items env) (let fnrec5148 ((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 fnrec5149 ((clause clause)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") clause)))) (let* ((_a$5150 (var-deref "jolt.analyzer" "analyze-arity")) (_a$5151 ctx) (_a$5152 (jolt-invoke (var-deref "jolt.analyzer" "strip-arglist-meta") (jolt-first cl))) (_a$5153 (jolt-rest cl)) (_a$5154 env) (_a$5155 fn-name)) (jolt-invoke _a$5150 _a$5151 _a$5152 _a$5153 _a$5154 _a$5155))))) rest-items)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "fn: bad params") jolt-nil)))))))) analyze-fn))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-try" (letrec ((analyze-try (lambda (ctx items env) (let fnrec5154 ((ctx ctx) (items items) (env env)) (let* ((clauses (jolt-rest items)) (body (jolt-invoke (var-deref "clojure.core" "atom") (jolt-vector))) (catch-sym (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil)) (catch-body (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil)) (finally-body (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil))) (begin (begin (jolt-count (jolt-map (lambda (c) (let fnrec5155 ((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__13__auto head)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") head) and__13__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 (jolt-truthy? (let* ((or__14__auto (< (jolt-count cl) 3))) (if (jolt-truthy? or__14__auto) or__14__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" "reset!") catch-sym (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth cl 2))) (jolt-invoke (var-deref "clojure.core" "reset!") catch-body (jolt-drop 3 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$5156 (keyword #f "op")) (_o$5157 (keyword #f "try")) (_o$5158 (keyword #f "body")) (_o$5159 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") body) env))) (jolt-hash-map _o$5156 _o$5157 _o$5158 _o$5159))) (n (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "deref") catch-body)) (let* ((_a$5164 n) (_a$5165 (keyword #f "catch-sym")) (_a$5166 (jolt-invoke (var-deref "clojure.core" "deref") catch-sym)) (_a$5167 (keyword #f "catch-body")) (_a$5168 (let* ((_a$5160 (var-deref "jolt.analyzer" "analyze-seq")) (_a$5161 ctx) (_a$5162 (jolt-invoke (var-deref "clojure.core" "deref") catch-body)) (_a$5163 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector (jolt-invoke (var-deref "clojure.core" "deref") catch-sym))))) (jolt-invoke _a$5160 _a$5161 _a$5162 _a$5163)))) (jolt-assoc _a$5164 _a$5165 _a$5166 _a$5167 _a$5168)) 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))) + (def-var! "jolt.analyzer" "analyze-try" (letrec ((analyze-try (lambda (ctx items env) (let fnrec5156 ((ctx ctx) (items items) (env env)) (let* ((clauses (jolt-rest items)) (body (jolt-invoke (var-deref "clojure.core" "atom") (jolt-vector))) (catch-sym (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil)) (catch-body (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil)) (finally-body (jolt-invoke (var-deref "clojure.core" "atom") jolt-nil))) (begin (begin (jolt-count (jolt-map (lambda (c) (let fnrec5157 ((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__13__auto head)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") head) and__13__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 (jolt-truthy? (let* ((or__14__auto (< (jolt-count cl) 3))) (if (jolt-truthy? or__14__auto) or__14__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" "reset!") catch-sym (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth cl 2))) (jolt-invoke (var-deref "clojure.core" "reset!") catch-body (jolt-drop 3 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$5158 (keyword #f "op")) (_o$5159 (keyword #f "try")) (_o$5160 (keyword #f "body")) (_o$5161 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") body) env))) (jolt-hash-map _o$5158 _o$5159 _o$5160 _o$5161))) (n (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "deref") catch-body)) (let* ((_a$5166 n) (_a$5167 (keyword #f "catch-sym")) (_a$5168 (jolt-invoke (var-deref "clojure.core" "deref") catch-sym)) (_a$5169 (keyword #f "catch-body")) (_a$5170 (let* ((_a$5162 (var-deref "jolt.analyzer" "analyze-seq")) (_a$5163 ctx) (_a$5164 (jolt-invoke (var-deref "clojure.core" "deref") catch-body)) (_a$5165 (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector (jolt-invoke (var-deref "clojure.core" "deref") catch-sym))))) (jolt-invoke _a$5162 _a$5163 _a$5164 _a$5165)))) (jolt-assoc _a$5166 _a$5167 _a$5168 _a$5169 _a$5170)) 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))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-letfn" (letrec ((analyze-letfn (lambda (ctx items env) (let fnrec5169 ((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 fnrec5170 ((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 fnrec5171 ((spec spec)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") spec)))) (let* ((_o$5172 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first cl))) (_o$5173 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-cons (jolt-invoke (var-deref "clojure.core" "symbol") "fn") cl) env*))) (jolt-vector _o$5172 _o$5173))))) specs))) (let* ((_o$5174 (keyword #f "op")) (_o$5175 (keyword #f "let")) (_o$5176 (keyword #f "letrec")) (_o$5177 #t) (_o$5178 (keyword #f "bindings")) (_o$5179 binds) (_o$5180 (keyword #f "body")) (_o$5181 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env*))) (jolt-hash-map _o$5174 _o$5175 _o$5176 _o$5177 _o$5178 _o$5179 _o$5180 _o$5181))))))) analyze-letfn))) + (def-var! "jolt.analyzer" "analyze-letfn" (letrec ((analyze-letfn (lambda (ctx items env) (let fnrec5171 ((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 fnrec5172 ((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 fnrec5173 ((spec spec)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") spec)))) (let* ((_o$5174 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first cl))) (_o$5175 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-cons (jolt-invoke (var-deref "clojure.core" "symbol") "fn") cl) env*))) (jolt-vector _o$5174 _o$5175))))) specs))) (let* ((_o$5176 (keyword #f "op")) (_o$5177 (keyword #f "let")) (_o$5178 (keyword #f "letrec")) (_o$5179 #t) (_o$5180 (keyword #f "bindings")) (_o$5181 binds) (_o$5182 (keyword #f "body")) (_o$5183 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env*))) (jolt-hash-map _o$5176 _o$5177 _o$5178 _o$5179 _o$5180 _o$5181 _o$5182 _o$5183))))))) analyze-letfn))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec5182 ((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" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec5184 ((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" "analyze-def" (letrec ((analyze-def (lambda (ctx items env) (let fnrec5183 ((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$5184 (keyword #f "op")) (_o$5185 (keyword #f "def")) (_o$5186 (keyword #f "ns")) (_o$5187 cur) (_o$5188 (keyword #f "name")) (_o$5189 nm) (_o$5190 (keyword #f "no-init")) (_o$5191 #t)) (jolt-hash-map _o$5184 _o$5185 _o$5186 _o$5187 _o$5188 _o$5189 _o$5190 _o$5191)))) (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 (let* ((_a$5192 (var-deref "jolt.analyzer" "with-ret-nhint")) (_a$5193 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env)) (_a$5194 (jolt-invoke (var-deref "jolt.analyzer" "tag->nkind") tag))) (jolt-invoke _a$5192 _a$5193 _a$5194)) node-meta)))))))))) analyze-def))) + (def-var! "jolt.analyzer" "analyze-def" (letrec ((analyze-def (lambda (ctx items env) (let fnrec5185 ((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$5186 (keyword #f "op")) (_o$5187 (keyword #f "def")) (_o$5188 (keyword #f "ns")) (_o$5189 cur) (_o$5190 (keyword #f "name")) (_o$5191 nm) (_o$5192 (keyword #f "no-init")) (_o$5193 #t)) (jolt-hash-map _o$5186 _o$5187 _o$5188 _o$5189 _o$5190 _o$5191 _o$5192 _o$5193)))) (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 (let* ((_a$5194 (var-deref "jolt.analyzer" "with-ret-nhint")) (_a$5195 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env)) (_a$5196 (jolt-invoke (var-deref "jolt.analyzer" "tag->nkind") tag))) (jolt-invoke _a$5194 _a$5195 _a$5196)) node-meta)))))))))) analyze-def))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-set!" (letrec ((analyze-set! (lambda (ctx items env) (let fnrec5195 ((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$5196 (keyword #f "op")) (_o$5197 (keyword #f "set-field")) (_o$5198 (keyword #f "obj")) (_o$5199 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth ti 1) env)) (_o$5200 (keyword #f "field")) (_o$5201 (jolt-invoke (var-deref "clojure.core" "subs") thead 2)) (_o$5202 (keyword #f "val")) (_o$5203 val-node)) (jolt-hash-map _o$5196 _o$5197 _o$5198 _o$5199 _o$5200 _o$5201 _o$5202 _o$5203)) (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$5207 (keyword #f "op")) (_o$5208 (keyword #f "set-var")) (_o$5209 (keyword #f "the-var")) (_o$5210 (let* ((_a$5204 (var-deref "jolt.ir" "the-var")) (_a$5205 (jolt-get r (keyword #f "ns"))) (_a$5206 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5204 _a$5205 _a$5206))) (_o$5211 (keyword #f "val")) (_o$5212 val-node)) (jolt-hash-map _o$5207 _o$5208 _o$5209 _o$5210 _o$5211 _o$5212))))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "set! of an unsupported target") jolt-nil)))))))) analyze-set!))) + (def-var! "jolt.analyzer" "analyze-set!" (letrec ((analyze-set! (lambda (ctx items env) (let fnrec5197 ((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$5198 (keyword #f "op")) (_o$5199 (keyword #f "set-field")) (_o$5200 (keyword #f "obj")) (_o$5201 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth ti 1) env)) (_o$5202 (keyword #f "field")) (_o$5203 (jolt-invoke (var-deref "clojure.core" "subs") thead 2)) (_o$5204 (keyword #f "val")) (_o$5205 val-node)) (jolt-hash-map _o$5198 _o$5199 _o$5200 _o$5201 _o$5202 _o$5203 _o$5204 _o$5205)) (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$5209 (keyword #f "op")) (_o$5210 (keyword #f "set-var")) (_o$5211 (keyword #f "the-var")) (_o$5212 (let* ((_a$5206 (var-deref "jolt.ir" "the-var")) (_a$5207 (jolt-get r (keyword #f "ns"))) (_a$5208 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5206 _a$5207 _a$5208))) (_o$5213 (keyword #f "val")) (_o$5214 val-node)) (jolt-hash-map _o$5209 _o$5210 _o$5211 _o$5212 _o$5213 _o$5214))))) (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" "analyze-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec5213 ((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$5214 (var-deref "jolt.ir" "if-node")) (_a$5215 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_a$5216 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (_a$5217 (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$5214 _a$5215 _a$5216 _a$5217))) (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$5222 (var-deref "jolt.ir" "let-node")) (_a$5223 (jolt-first r)) (_a$5224 (let* ((_a$5218 (var-deref "jolt.analyzer" "analyze-seq")) (_a$5219 ctx) (_a$5220 (jolt-drop 2 items)) (_a$5221 (jolt-invoke (var-deref "clojure.core" "second") r))) (jolt-invoke _a$5218 _a$5219 _a$5220 _a$5221)))) (jolt-invoke _a$5222 _a$5223 _a$5224))) (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$5225 (keyword #f "op")) (_o$5226 (keyword #f "loop")) (_o$5227 (keyword #f "recur-name")) (_o$5228 rname) (_o$5229 (keyword #f "bindings")) (_o$5230 (jolt-first r)) (_o$5231 (keyword #f "body")) (_o$5232 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env**))) (jolt-hash-map _o$5225 _o$5226 _o$5227 _o$5228 _o$5229 _o$5230 _o$5231 _o$5232))) (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$5237 (keyword #f "op")) (_o$5238 (keyword #f "recur")) (_o$5239 (keyword #f "recur-name")) (_o$5240 rt) (_o$5241 (keyword #f "args")) (_o$5242 (let* ((_a$5234 (var-deref "clojure.core" "mapv")) (_a$5235 (lambda (p__50_) (let fnrec5233 ((p__50_ p__50_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__50_ env)))) (_a$5236 (jolt-rest items))) (jolt-invoke _a$5234 _a$5235 _a$5236)))) (jolt-hash-map _o$5237 _o$5238 _o$5239 _o$5240 _o$5241 _o$5242)))) (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$5243 (var-deref "jolt.ir" "the-var")) (_a$5244 (jolt-get r (keyword #f "ns"))) (_a$5245 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5243 _a$5244 _a$5245)) (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$5246 (keyword #f "op")) (_o$5247 (keyword #f "defmacro")) (_o$5248 (keyword #f "ns")) (_o$5249 cur) (_o$5250 (keyword #f "name")) (_o$5251 nm) (_o$5252 (keyword #f "fn")) (_o$5253 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx fn-form env))) (jolt-hash-map _o$5246 _o$5247 _o$5248 _o$5249 _o$5250 _o$5251 _o$5252 _o$5253)))) (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))) + (def-var! "jolt.analyzer" "analyze-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec5215 ((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$5216 (var-deref "jolt.ir" "if-node")) (_a$5217 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_a$5218 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2) env)) (_a$5219 (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$5216 _a$5217 _a$5218 _a$5219))) (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$5224 (var-deref "jolt.ir" "let-node")) (_a$5225 (jolt-first r)) (_a$5226 (let* ((_a$5220 (var-deref "jolt.analyzer" "analyze-seq")) (_a$5221 ctx) (_a$5222 (jolt-drop 2 items)) (_a$5223 (jolt-invoke (var-deref "clojure.core" "second") r))) (jolt-invoke _a$5220 _a$5221 _a$5222 _a$5223)))) (jolt-invoke _a$5224 _a$5225 _a$5226))) (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$5227 (keyword #f "op")) (_o$5228 (keyword #f "loop")) (_o$5229 (keyword #f "recur-name")) (_o$5230 rname) (_o$5231 (keyword #f "bindings")) (_o$5232 (jolt-first r)) (_o$5233 (keyword #f "body")) (_o$5234 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2 items) env**))) (jolt-hash-map _o$5227 _o$5228 _o$5229 _o$5230 _o$5231 _o$5232 _o$5233 _o$5234))) (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$5239 (keyword #f "op")) (_o$5240 (keyword #f "recur")) (_o$5241 (keyword #f "recur-name")) (_o$5242 rt) (_o$5243 (keyword #f "args")) (_o$5244 (let* ((_a$5236 (var-deref "clojure.core" "mapv")) (_a$5237 (lambda (p__50_) (let fnrec5235 ((p__50_ p__50_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__50_ env)))) (_a$5238 (jolt-rest items))) (jolt-invoke _a$5236 _a$5237 _a$5238)))) (jolt-hash-map _o$5239 _o$5240 _o$5241 _o$5242 _o$5243 _o$5244)))) (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$5245 (var-deref "jolt.ir" "the-var")) (_a$5246 (jolt-get r (keyword #f "ns"))) (_a$5247 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5245 _a$5246 _a$5247)) (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$5248 (keyword #f "op")) (_o$5249 (keyword #f "defmacro")) (_o$5250 (keyword #f "ns")) (_o$5251 cur) (_o$5252 (keyword #f "name")) (_o$5253 nm) (_o$5254 (keyword #f "fn")) (_o$5255 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx fn-form env))) (jolt-hash-map _o$5248 _o$5249 _o$5250 _o$5251 _o$5252 _o$5253 _o$5254 _o$5255)))) (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" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec5254 ((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" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec5256 ((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-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec5255 ((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$5260 (keyword #f "op")) (_o$5261 (keyword #f "host-call")) (_o$5262 (keyword #f "method")) (_o$5263 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$5264 (keyword #f "target")) (_o$5265 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5266 (keyword #f "args")) (_o$5267 (let* ((_a$5257 (var-deref "clojure.core" "mapv")) (_a$5258 (lambda (p__51_) (let fnrec5256 ((p__51_ p__51_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__51_ env)))) (_a$5259 (jolt-drop 2 items))) (jolt-invoke _a$5257 _a$5258 _a$5259)))) (jolt-hash-map _o$5260 _o$5261 _o$5262 _o$5263 _o$5264 _o$5265 _o$5266 _o$5267))))))) analyze-host-call))) + (def-var! "jolt.analyzer" "analyze-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec5257 ((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$5262 (keyword #f "op")) (_o$5263 (keyword #f "host-call")) (_o$5264 (keyword #f "method")) (_o$5265 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$5266 (keyword #f "target")) (_o$5267 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5268 (keyword #f "args")) (_o$5269 (let* ((_a$5259 (var-deref "clojure.core" "mapv")) (_a$5260 (lambda (p__51_) (let fnrec5258 ((p__51_ p__51_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__51_ env)))) (_a$5261 (jolt-drop 2 items))) (jolt-invoke _a$5259 _a$5260 _a$5261)))) (jolt-hash-map _o$5262 _o$5263 _o$5264 _o$5265 _o$5266 _o$5267 _o$5268 _o$5269))))))) analyze-host-call))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec5268 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (let* ((_a$5269 (var-deref "clojure.core" "subs")) (_a$5270 nm) (_a$5271 (jolt-dec (jolt-count nm))) (_a$5272 (jolt-count nm))) (jolt-invoke _a$5269 _a$5270 _a$5271 _a$5272))))) (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" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec5270 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (let* ((_a$5271 (var-deref "clojure.core" "subs")) (_a$5272 nm) (_a$5273 (jolt-dec (jolt-count nm))) (_a$5274 (jolt-count nm))) (jolt-invoke _a$5271 _a$5272 _a$5273 _a$5274))))) (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" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec5273 ((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 fnrec5274 ((p__52_ p__52_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__52_ env))) args)))))) analyze-ctor))) + (def-var! "jolt.analyzer" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec5275 ((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 fnrec5276 ((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-ffi-fn" (letrec ((analyze-ffi-fn (lambda (ctx items env) (let fnrec5275 ((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$5276 (keyword #f "op")) (_o$5277 (keyword #f "ffi-fn")) (_o$5278 (keyword #f "csym")) (_o$5279 (jolt-nth items 1)) (_o$5280 (keyword #f "argtypes")) (_o$5281 (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$5282 (keyword #f "rettype")) (_o$5283 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$5284 (keyword #f "blocking")) (_o$5285 (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$5276 _o$5277 _o$5278 _o$5279 _o$5280 _o$5281 _o$5282 _o$5283 _o$5284 _o$5285))))))) analyze-ffi-fn))) + (def-var! "jolt.analyzer" "analyze-ffi-fn" (letrec ((analyze-ffi-fn (lambda (ctx items env) (let fnrec5277 ((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$5278 (keyword #f "op")) (_o$5279 (keyword #f "ffi-fn")) (_o$5280 (keyword #f "csym")) (_o$5281 (jolt-nth items 1)) (_o$5282 (keyword #f "argtypes")) (_o$5283 (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$5284 (keyword #f "rettype")) (_o$5285 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$5286 (keyword #f "blocking")) (_o$5287 (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$5278 _o$5279 _o$5280 _o$5281 _o$5282 _o$5283 _o$5284 _o$5285 _o$5286 _o$5287))))))) analyze-ffi-fn))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-ffi-callable" (letrec ((analyze-ffi-callable (lambda (ctx items env) (let fnrec5286 ((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$5287 (keyword #f "op")) (_o$5288 (keyword #f "ffi-callable")) (_o$5289 (keyword #f "fn")) (_o$5290 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5291 (keyword #f "argtypes")) (_o$5292 (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$5293 (keyword #f "rettype")) (_o$5294 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$5295 (keyword #f "collect-safe")) (_o$5296 (let* ((and__13__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__13__auto) (jolt= "collect-safe" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__13__auto)))) (jolt-hash-map _o$5287 _o$5288 _o$5289 _o$5290 _o$5291 _o$5292 _o$5293 _o$5294 _o$5295 _o$5296))))))) analyze-ffi-callable))) + (def-var! "jolt.analyzer" "analyze-ffi-callable" (letrec ((analyze-ffi-callable (lambda (ctx items env) (let fnrec5288 ((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$5289 (keyword #f "op")) (_o$5290 (keyword #f "ffi-callable")) (_o$5291 (keyword #f "fn")) (_o$5292 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5293 (keyword #f "argtypes")) (_o$5294 (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$5295 (keyword #f "rettype")) (_o$5296 (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 3))) (_o$5297 (keyword #f "collect-safe")) (_o$5298 (let* ((and__13__auto (jolt= 5 (jolt-count items)))) (if (jolt-truthy? and__13__auto) (jolt= "collect-safe" (jolt-invoke (var-deref "clojure.core" "name") (jolt-nth items 4))) and__13__auto)))) (jolt-hash-map _o$5289 _o$5290 _o$5291 _o$5292 _o$5293 _o$5294 _o$5295 _o$5296 _o$5297 _o$5298))))))) analyze-ffi-callable))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec5297 ((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$5302 (keyword #f "op")) (_o$5303 (keyword #f "host-call")) (_o$5304 (keyword #f "method")) (_o$5305 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$5306 (keyword #f "target")) (_o$5307 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5308 (keyword #f "args")) (_o$5309 (let* ((_a$5299 (var-deref "clojure.core" "mapv")) (_a$5300 (lambda (p__53_) (let fnrec5298 ((p__53_ p__53_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__53_ env)))) (_a$5301 (jolt-drop 3 items))) (jolt-invoke _a$5299 _a$5300 _a$5301)))) (jolt-hash-map _o$5302 _o$5303 _o$5304 _o$5305 _o$5306 _o$5307 _o$5308 _o$5309)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-keyword?") member)) (let* ((_a$5310 (var-deref "jolt.ir" "invoke")) (_a$5311 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx member env)) (_a$5312 (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)))) (jolt-invoke _a$5310 _a$5311 _a$5312)) (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" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec5299 ((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$5304 (keyword #f "op")) (_o$5305 (keyword #f "host-call")) (_o$5306 (keyword #f "method")) (_o$5307 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$5308 (keyword #f "target")) (_o$5309 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5310 (keyword #f "args")) (_o$5311 (let* ((_a$5301 (var-deref "clojure.core" "mapv")) (_a$5302 (lambda (p__53_) (let fnrec5300 ((p__53_ p__53_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__53_ env)))) (_a$5303 (jolt-drop 3 items))) (jolt-invoke _a$5301 _a$5302 _a$5303)))) (jolt-hash-map _o$5304 _o$5305 _o$5306 _o$5307 _o$5308 _o$5309 _o$5310 _o$5311)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-keyword?") member)) (let* ((_a$5312 (var-deref "jolt.ir" "invoke")) (_a$5313 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx member env)) (_a$5314 (jolt-vector (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)))) (jolt-invoke _a$5312 _a$5313 _a$5314)) (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-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec5313 ((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$5314 (keyword #f "op")) (_o$5315 (keyword #f "host-call")) (_o$5316 (keyword #f "method")) (_o$5317 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$5318 (keyword #f "target")) (_o$5319 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5320 (keyword #f "args")) (_o$5321 (jolt-vector))) (jolt-hash-map _o$5314 _o$5315 _o$5316 _o$5317 _o$5318 _o$5319 _o$5320 _o$5321))))))) analyze-field))) + (def-var! "jolt.analyzer" "analyze-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec5315 ((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$5316 (keyword #f "op")) (_o$5317 (keyword #f "host-call")) (_o$5318 (keyword #f "method")) (_o$5319 (jolt-invoke (var-deref "clojure.core" "subs") hname 1)) (_o$5320 (keyword #f "target")) (_o$5321 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1) env)) (_o$5322 (keyword #f "args")) (_o$5323 (jolt-vector))) (jolt-hash-map _o$5316 _o$5317 _o$5318 _o$5319 _o$5320 _o$5321 _o$5322 _o$5323))))))) analyze-field))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec5322 ((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* ((G__45 (let* ((_a$5323 (var-deref "jolt.ir" "var-ref")) (_a$5324 (jolt-get r (keyword #f "ns"))) (_a$5325 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5323 _a$5324 _a$5325)))) (let* ((G__46 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__45 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__45))) G__46)) (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__47 (jolt-get r (keyword #f "kind")))) (if (jolt= G__47 (keyword #f "var")) (let* ((G__48 (let* ((_a$5326 (var-deref "jolt.ir" "var-ref")) (_a$5327 (jolt-get r (keyword #f "ns"))) (_a$5328 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5326 _a$5327 _a$5328)))) (let* ((G__49 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__48 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__48))) G__49)) (if (jolt= G__47 (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-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec5324 ((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* ((G__45 (let* ((_a$5325 (var-deref "jolt.ir" "var-ref")) (_a$5326 (jolt-get r (keyword #f "ns"))) (_a$5327 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5325 _a$5326 _a$5327)))) (let* ((G__46 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__45 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__45))) G__46)) (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__47 (jolt-get r (keyword #f "kind")))) (if (jolt= G__47 (keyword #f "var")) (let* ((G__48 (let* ((_a$5328 (var-deref "jolt.ir" "var-ref")) (_a$5329 (jolt-get r (keyword #f "ns"))) (_a$5330 (jolt-get r (keyword #f "name")))) (jolt-invoke _a$5328 _a$5329 _a$5330)))) (let* ((G__49 (if (jolt-truthy? (jolt-get r (keyword #f "num-ret"))) (jolt-assoc G__48 (keyword #f "num-ret") (jolt-get r (keyword #f "num-ret"))) G__48))) G__49)) (if (jolt= G__47 (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 fnrec5329 ((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 (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= "__ccallable" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-callable") 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$5330 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$5331 ctx) (_a$5332 (jolt-invoke (var-deref "clojure.core" "subs") hname 0 (jolt-dec (jolt-count hname)))) (_a$5333 (jolt-rest items)) (_a$5334 env)) (jolt-invoke _a$5330 _a$5331 _a$5332 _a$5333 _a$5334)) (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$5335 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$5336 ctx) (_a$5337 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1))) (_a$5338 (jolt-drop 2 items)) (_a$5339 env)) (jolt-invoke _a$5335 _a$5336 _a$5337 _a$5338 _a$5339)) (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$5344 (var-deref "jolt.ir" "invoke")) (_a$5345 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env)) (_a$5346 (let* ((_a$5341 (var-deref "clojure.core" "mapv")) (_a$5342 (lambda (p__54_) (let fnrec5340 ((p__54_ p__54_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__54_ env)))) (_a$5343 (jolt-rest items))) (jolt-invoke _a$5341 _a$5342 _a$5343)))) (jolt-invoke _a$5344 _a$5345 _a$5346))) (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-list" (letrec ((analyze-list (lambda (ctx form env) (let fnrec5331 ((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 (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= "__ccallable" (jolt-invoke (var-deref "jolt.host" "form-sym-name") head)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ffi-callable") 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$5332 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$5333 ctx) (_a$5334 (jolt-invoke (var-deref "clojure.core" "subs") hname 0 (jolt-dec (jolt-count hname)))) (_a$5335 (jolt-rest items)) (_a$5336 env)) (jolt-invoke _a$5332 _a$5333 _a$5334 _a$5335 _a$5336)) (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$5337 (var-deref "jolt.analyzer" "analyze-ctor")) (_a$5338 ctx) (_a$5339 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1))) (_a$5340 (jolt-drop 2 items)) (_a$5341 env)) (jolt-invoke _a$5337 _a$5338 _a$5339 _a$5340 _a$5341)) (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$5346 (var-deref "jolt.ir" "invoke")) (_a$5347 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env)) (_a$5348 (let* ((_a$5343 (var-deref "clojure.core" "mapv")) (_a$5344 (lambda (p__54_) (let fnrec5342 ((p__54_ p__54_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__54_ env)))) (_a$5345 (jolt-rest items))) (jolt-invoke _a$5343 _a$5344 _a$5345)))) (jolt-invoke _a$5346 _a$5347 _a$5348))) (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 fnrec5347 ((ctx ctx) (form form)) (jolt-invoke analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env"))))) ((ctx form env) (let fnrec5348 ((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$5350 (var-deref "clojure.core" "mapv")) (_a$5351 (lambda (p__55_) (let fnrec5349 ((p__55_ p__55_)) (jolt-invoke analyze ctx p__55_ env)))) (_a$5352 (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (jolt-invoke _a$5350 _a$5351 _a$5352))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$5356 (var-deref "clojure.core" "mapv")) (_a$5357 (lambda (p) (let fnrec5353 ((p p)) (let* ((_o$5354 (jolt-invoke analyze ctx (jolt-first p) env)) (_o$5355 (jolt-invoke analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$5354 _o$5355))))) (_a$5358 (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (jolt-invoke _a$5356 _a$5357 _a$5358))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.ir" "set-node") (let* ((_a$5360 (var-deref "clojure.core" "mapv")) (_a$5361 (lambda (p__56_) (let fnrec5359 ((p__56_ p__56_)) (jolt-invoke analyze ctx p__56_ env)))) (_a$5362 (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (jolt-invoke _a$5360 _a$5361 _a$5362))) (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$5363 (keyword #f "op")) (_o$5364 (keyword #f "regex")) (_o$5365 (keyword #f "source")) (_o$5366 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$5363 _o$5364 _o$5365 _o$5366)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$5367 (keyword #f "op")) (_o$5368 (keyword #f "inst")) (_o$5369 (keyword #f "source")) (_o$5370 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$5367 _o$5368 _o$5369 _o$5370)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$5371 (keyword #f "op")) (_o$5372 (keyword #f "uuid")) (_o$5373 (keyword #f "source")) (_o$5374 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$5371 _o$5372 _o$5373 _o$5374)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-bigdec?") form)) (let* ((_o$5375 (keyword #f "op")) (_o$5376 (keyword #f "bigdec")) (_o$5377 (keyword #f "source")) (_o$5378 (jolt-invoke (var-deref "jolt.host" "form-bigdec-source") form))) (jolt-hash-map _o$5375 _o$5376 _o$5377 _o$5378)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-ns-value?") form)) (let* ((_o$5379 (keyword #f "op")) (_o$5380 (keyword #f "the-ns")) (_o$5381 (keyword #f "name")) (_o$5382 (jolt-invoke (var-deref "jolt.host" "form-ns-value-name") form))) (jolt-hash-map _o$5379 _o$5380 _o$5381 _o$5382)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "unsupported form") jolt-nil))))))))))))))))) analyze))) + (def-var! "jolt.analyzer" "analyze" (letrec ((analyze (case-lambda ((ctx form) (let fnrec5349 ((ctx ctx) (form form)) (jolt-invoke analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env"))))) ((ctx form env) (let fnrec5350 ((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$5352 (var-deref "clojure.core" "mapv")) (_a$5353 (lambda (p__55_) (let fnrec5351 ((p__55_ p__55_)) (jolt-invoke analyze ctx p__55_ env)))) (_a$5354 (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (jolt-invoke _a$5352 _a$5353 _a$5354))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.ir" "map-node") (let* ((_a$5358 (var-deref "clojure.core" "mapv")) (_a$5359 (lambda (p) (let fnrec5355 ((p p)) (let* ((_o$5356 (jolt-invoke analyze ctx (jolt-first p) env)) (_o$5357 (jolt-invoke analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$5356 _o$5357))))) (_a$5360 (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (jolt-invoke _a$5358 _a$5359 _a$5360))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.ir" "set-node") (let* ((_a$5362 (var-deref "clojure.core" "mapv")) (_a$5363 (lambda (p__56_) (let fnrec5361 ((p__56_ p__56_)) (jolt-invoke analyze ctx p__56_ env)))) (_a$5364 (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (jolt-invoke _a$5362 _a$5363 _a$5364))) (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$5365 (keyword #f "op")) (_o$5366 (keyword #f "regex")) (_o$5367 (keyword #f "source")) (_o$5368 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$5365 _o$5366 _o$5367 _o$5368)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$5369 (keyword #f "op")) (_o$5370 (keyword #f "inst")) (_o$5371 (keyword #f "source")) (_o$5372 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$5369 _o$5370 _o$5371 _o$5372)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$5373 (keyword #f "op")) (_o$5374 (keyword #f "uuid")) (_o$5375 (keyword #f "source")) (_o$5376 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$5373 _o$5374 _o$5375 _o$5376)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-bigdec?") form)) (let* ((_o$5377 (keyword #f "op")) (_o$5378 (keyword #f "bigdec")) (_o$5379 (keyword #f "source")) (_o$5380 (jolt-invoke (var-deref "jolt.host" "form-bigdec-source") form))) (jolt-hash-map _o$5377 _o$5378 _o$5379 _o$5380)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-ns-value?") form)) (let* ((_o$5381 (keyword #f "op")) (_o$5382 (keyword #f "the-ns")) (_o$5383 (keyword #f "name")) (_o$5384 (jolt-invoke (var-deref "jolt.host" "form-ns-value-name") form))) (jolt-hash-map _o$5381 _o$5382 _o$5383 _o$5384)) (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$3963 "+") (_o$3964 "+") (_o$3965 "-") (_o$3966 "-") (_o$3967 "*") (_o$3968 "*") (_o$3969 "/") (_o$3970 "/") (_o$3971 "<") (_o$3972 "<") (_o$3973 ">") (_o$3974 ">") (_o$3975 "<=") (_o$3976 "<=") (_o$3977 ">=") (_o$3978 ">=") (_o$3979 "=") (_o$3980 "jolt=") (_o$3981 "inc") (_o$3982 "jolt-inc") (_o$3983 "dec") (_o$3984 "jolt-dec") (_o$3985 "not") (_o$3986 "jolt-not") (_o$3987 "min") (_o$3988 "min") (_o$3989 "max") (_o$3990 "max") (_o$3991 "mod") (_o$3992 "modulo") (_o$3993 "rem") (_o$3994 "remainder") (_o$3995 "quot") (_o$3996 "quotient") (_o$3997 "vector") (_o$3998 "jolt-vector") (_o$3999 "hash-map") (_o$4000 "jolt-hash-map") (_o$4001 "hash-set") (_o$4002 "jolt-hash-set") (_o$4003 "conj") (_o$4004 "jolt-conj") (_o$4005 "get") (_o$4006 "jolt-get") (_o$4007 "nth") (_o$4008 "jolt-nth") (_o$4009 "count") (_o$4010 "jolt-count") (_o$4011 "assoc") (_o$4012 "jolt-assoc") (_o$4013 "dissoc") (_o$4014 "jolt-dissoc") (_o$4015 "contains?") (_o$4016 "jolt-contains?") (_o$4017 "empty?") (_o$4018 "jolt-empty?") (_o$4019 "peek") (_o$4020 "jolt-peek") (_o$4021 "pop") (_o$4022 "jolt-pop") (_o$4023 "first") (_o$4024 "jolt-first") (_o$4025 "rest") (_o$4026 "jolt-rest") (_o$4027 "next") (_o$4028 "jolt-next") (_o$4029 "seq") (_o$4030 "jolt-seq") (_o$4031 "cons") (_o$4032 "jolt-cons") (_o$4033 "list") (_o$4034 "jolt-list") (_o$4035 "reverse") (_o$4036 "jolt-reverse") (_o$4037 "last") (_o$4038 "jolt-last") (_o$4039 "map") (_o$4040 "jolt-map") (_o$4041 "filter") (_o$4042 "jolt-filter") (_o$4043 "remove") (_o$4044 "jolt-remove") (_o$4045 "reduce") (_o$4046 "jolt-reduce") (_o$4047 "into") (_o$4048 "jolt-into") (_o$4049 "concat") (_o$4050 "jolt-concat") (_o$4051 "apply") (_o$4052 "jolt-apply") (_o$4053 "range") (_o$4054 "jolt-range") (_o$4055 "take") (_o$4056 "jolt-take") (_o$4057 "drop") (_o$4058 "jolt-drop") (_o$4059 "keys") (_o$4060 "jolt-keys") (_o$4061 "vals") (_o$4062 "jolt-vals") (_o$4063 "even?") (_o$4064 "jolt-even?") (_o$4065 "odd?") (_o$4066 "jolt-odd?") (_o$4067 "pos?") (_o$4068 "jolt-pos?") (_o$4069 "neg?") (_o$4070 "jolt-neg?") (_o$4071 "zero?") (_o$4072 "jolt-zero?") (_o$4073 "identity") (_o$4074 "jolt-identity") (_o$4075 "ex-info") (_o$4076 "jolt-ex-info")) (jolt-hash-map _o$3963 _o$3964 _o$3965 _o$3966 _o$3967 _o$3968 _o$3969 _o$3970 _o$3971 _o$3972 _o$3973 _o$3974 _o$3975 _o$3976 _o$3977 _o$3978 _o$3979 _o$3980 _o$3981 _o$3982 _o$3983 _o$3984 _o$3985 _o$3986 _o$3987 _o$3988 _o$3989 _o$3990 _o$3991 _o$3992 _o$3993 _o$3994 _o$3995 _o$3996 _o$3997 _o$3998 _o$3999 _o$4000 _o$4001 _o$4002 _o$4003 _o$4004 _o$4005 _o$4006 _o$4007 _o$4008 _o$4009 _o$4010 _o$4011 _o$4012 _o$4013 _o$4014 _o$4015 _o$4016 _o$4017 _o$4018 _o$4019 _o$4020 _o$4021 _o$4022 _o$4023 _o$4024 _o$4025 _o$4026 _o$4027 _o$4028 _o$4029 _o$4030 _o$4031 _o$4032 _o$4033 _o$4034 _o$4035 _o$4036 _o$4037 _o$4038 _o$4039 _o$4040 _o$4041 _o$4042 _o$4043 _o$4044 _o$4045 _o$4046 _o$4047 _o$4048 _o$4049 _o$4050 _o$4051 _o$4052 _o$4053 _o$4054 _o$4055 _o$4056 _o$4057 _o$4058 _o$4059 _o$4060 _o$4061 _o$4062 _o$4063 _o$4064 _o$4065 _o$4066 _o$4067 _o$4068 _o$4069 _o$4070 _o$4071 _o$4072 _o$4073 _o$4074 _o$4075 _o$4076)) (jolt-hash-map (keyword #f "private") #t))) (guard (e (#t #f)) @@ -250,6 +250,10 @@ (def-var! "jolt.passes.fold" "const-fold" (letrec ((const-fold (lambda (node) (let fnrec4774 ((node node)) (let* ((op (jolt-get node (keyword #f "op")))) (if (jolt= op (keyword #f "invoke")) (let* ((n (jolt-invoke (var-deref "jolt.ir" "map-ir-children") const-fold node)) (ff (jolt-invoke (var-deref "jolt.passes.fold" "fold-fn") (jolt-get n (keyword #f "fn")))) (args (jolt-get n (keyword #f "args"))) (folded (if (jolt-truthy? (let* ((and__13__auto ff)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-pos? (jolt-count args)))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "every?") (var-deref "jolt.passes.fold" "const-num?") args) and__13__auto)) and__13__auto))) (guard (e (else jolt-nil)) (let* ((_o$4776 (keyword #f "op")) (_o$4777 (keyword #f "const")) (_o$4778 (keyword #f "val")) (_o$4779 (jolt-apply ff (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (a) (let fnrec4775 ((a a)) (jolt-get a (keyword #f "val")))) args)))) (jolt-hash-map _o$4776 _o$4777 _o$4778 _o$4779))) jolt-nil))) (let* ((or__14__auto folded)) (if (jolt-truthy? or__14__auto) or__14__auto n))) (if (jolt= op (keyword #f "if")) (let* ((t (jolt-invoke const-fold (jolt-get node (keyword #f "test"))))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.fold" "const?") t)) (if (jolt-truthy? (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "nil?") (jolt-get t (keyword #f "val"))))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt= #f (jolt-get t (keyword #f "val")))))) (jolt-invoke const-fold (jolt-get node (keyword #f "else"))) (jolt-invoke const-fold (jolt-get node (keyword #f "then")))) (let* ((_a$4780 node) (_a$4781 (keyword #f "test")) (_a$4782 t) (_a$4783 (keyword #f "then")) (_a$4784 (jolt-invoke const-fold (jolt-get node (keyword #f "then")))) (_a$4785 (keyword #f "else")) (_a$4786 (jolt-invoke const-fold (jolt-get node (keyword #f "else"))))) (jolt-assoc _a$4780 _a$4781 _a$4782 _a$4783 _a$4784 _a$4785 _a$4786)))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.ir" "map-ir-children") const-fold node) jolt-nil)))))))) const-fold))) (guard (e (#t #f)) (def-var! "jolt.passes.fold" "scalar-const?" (letrec ((scalar-const? (lambda (n) (let fnrec4787 ((n n)) (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get n (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((v (jolt-get n (keyword #f "val")))) (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "keyword?") v))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "string?") v))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "number?") v))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt-invoke (var-deref "clojure.core" "boolean?") v)))))))) and__13__auto)))))) scalar-const?))) +(guard (e (#t #f)) + (def-var! "jolt.passes.fold" "kw-callee?" (letrec ((kw-callee? (lambda (fnode) (let fnrec4788 ((fnode fnode)) (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get fnode (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "keyword?") (jolt-get fnode (keyword #f "val"))) and__13__auto)))))) kw-callee?))) +(guard (e (#t #f)) + (def-var! "jolt.passes.fold" "get-callee?" (letrec ((get-callee? (lambda (fnode) (let fnrec4789 ((fnode fnode)) (let* ((or__14__auto (let* ((and__13__auto (jolt= (keyword #f "var") (jolt-get fnode (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "clojure.core" (jolt-get fnode (keyword #f "ns"))))) (if (jolt-truthy? and__13__auto) (jolt= "get" (jolt-get fnode (keyword #f "name"))) and__13__auto)) and__13__auto)))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((and__13__auto (jolt= (keyword #f "host") (jolt-get fnode (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt= "get" (jolt-get fnode (keyword #f "name"))) and__13__auto)))))))) get-callee?))) (guard (e (#t #f)) (def-var! "jolt.passes.numeric" "int-lit?" (letrec ((int-lit? (lambda (n) (let fnrec3556 ((n n)) (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get n (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((v (jolt-get n (keyword #f "val")))) (let* ((and__13__auto (jolt-invoke (var-deref "clojure.core" "number?") v))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "integer?") v) and__13__auto))) and__13__auto)))))) int-lit?))) (guard (e (#t #f)) @@ -313,7 +317,7 @@ (guard (e (#t #f)) (def-var-with-meta! "jolt.passes.inline" "pure-fns" (let* ((_o$3856 "+") (_o$3857 "-") (_o$3858 "*") (_o$3859 "/") (_o$3860 "<") (_o$3861 ">") (_o$3862 "<=") (_o$3863 ">=") (_o$3864 "=") (_o$3865 "not=") (_o$3866 "inc") (_o$3867 "dec") (_o$3868 "mod") (_o$3869 "rem") (_o$3870 "quot") (_o$3871 "min") (_o$3872 "max") (_o$3873 "abs") (_o$3874 "nil?") (_o$3875 "some?") (_o$3876 "not") (_o$3877 "get") (_o$3878 "zero?") (_o$3879 "pos?") (_o$3880 "neg?") (_o$3881 "even?") (_o$3882 "odd?") (_o$3883 "bit-and") (_o$3884 "bit-or") (_o$3885 "bit-xor")) (jolt-hash-set _o$3856 _o$3857 _o$3858 _o$3859 _o$3860 _o$3861 _o$3862 _o$3863 _o$3864 _o$3865 _o$3866 _o$3867 _o$3868 _o$3869 _o$3870 _o$3871 _o$3872 _o$3873 _o$3874 _o$3875 _o$3876 _o$3877 _o$3878 _o$3879 _o$3880 _o$3881 _o$3882 _o$3883 _o$3884 _o$3885)) (jolt-hash-map (keyword #f "private") #t))) (guard (e (#t #f)) - (def-var! "jolt.passes.inline" "pure-fn?" (letrec ((pure-fn? (lambda (f) (let fnrec3886 ((f f)) (let* ((op (jolt-get f (keyword #f "op")))) (if (jolt-truthy? (let* ((and__13__auto (jolt= op (keyword #f "const")))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "keyword?") (jolt-get f (keyword #f "val"))) and__13__auto))) #t (if (jolt= op (keyword #f "var")) (let* ((and__13__auto (jolt= "clojure.core" (jolt-get f (keyword #f "ns"))))) (if (jolt-truthy? and__13__auto) (jolt-contains? (var-deref "jolt.passes.inline" "pure-fns") (jolt-get f (keyword #f "name"))) and__13__auto)) (if (jolt= op (keyword #f "host")) (jolt-contains? (var-deref "jolt.passes.inline" "pure-fns") (jolt-get f (keyword #f "name"))) (if (jolt-truthy? (keyword #f "else")) #f jolt-nil))))))))) pure-fn?))) + (def-var! "jolt.passes.inline" "pure-fn?" (letrec ((pure-fn? (lambda (f) (let fnrec3886 ((f f)) (let* ((op (jolt-get f (keyword #f "op")))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.fold" "kw-callee?") f)) #t (if (jolt= op (keyword #f "var")) (let* ((and__13__auto (jolt= "clojure.core" (jolt-get f (keyword #f "ns"))))) (if (jolt-truthy? and__13__auto) (jolt-contains? (var-deref "jolt.passes.inline" "pure-fns") (jolt-get f (keyword #f "name"))) and__13__auto)) (if (jolt= op (keyword #f "host")) (jolt-contains? (var-deref "jolt.passes.inline" "pure-fns") (jolt-get f (keyword #f "name"))) (if (jolt-truthy? (keyword #f "else")) #f jolt-nil))))))))) pure-fn?))) (guard (e (#t #f)) (declare-var! "jolt.passes.inline" "ctor-shape")) (guard (e (#t #f)) @@ -325,7 +329,7 @@ (guard (e (#t #f)) (def-var! "jolt.passes.inline" "map-val" (letrec ((map-val (lambda (mapnode k) (let fnrec3896 ((mapnode mapnode) (k k)) (let* ((prs (jolt-get mapnode (keyword #f "pairs"))) (n (jolt-count prs))) (let* ((i 0)) (let loop3897 ((i i)) (if (< i n) (let* ((pr (jolt-nth prs i))) (if (jolt= (jolt-get (jolt-nth pr 0) (keyword #f "val")) k) (jolt-nth pr 1) (loop3897 (jolt-inc i)))) (let* ((_o$3898 (keyword #f "op")) (_o$3899 (keyword #f "const")) (_o$3900 (keyword #f "val")) (_o$3901 jolt-nil)) (jolt-hash-map _o$3898 _o$3899 _o$3900 _o$3901)))))))))) map-val))) (guard (e (#t #f)) - (def-var! "jolt.passes.inline" "lookup-key" (letrec ((lookup-key (lambda (node nm) (let fnrec3902 ((node node) (nm nm)) (if (jolt= (keyword #f "invoke") (jolt-get node (keyword #f "op"))) (let* ((f (jolt-get node (keyword #f "fn"))) (args (jolt-get node (keyword #f "args")))) (if (jolt-truthy? (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get f (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "clojure.core" "keyword?") (jolt-get f (keyword #f "val"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= 1 (jolt-count args)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= (keyword #f "local") (jolt-get (jolt-nth args 0) (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt= nm (jolt-get (jolt-nth args 0) (keyword #f "name"))) and__13__auto)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-get f (keyword #f "val")) (if (jolt-truthy? (let* ((and__13__auto (let* ((or__14__auto (let* ((and__13__auto (jolt= (keyword #f "var") (jolt-get f (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "clojure.core" (jolt-get f (keyword #f "ns"))))) (if (jolt-truthy? and__13__auto) (jolt= "get" (jolt-get f (keyword #f "name"))) and__13__auto)) and__13__auto)))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((and__13__auto (jolt= (keyword #f "host") (jolt-get f (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt= "get" (jolt-get f (keyword #f "name"))) and__13__auto)))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= 2 (jolt-count args)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= (keyword #f "local") (jolt-get (jolt-nth args 0) (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= nm (jolt-get (jolt-nth args 0) (keyword #f "name"))))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.fold" "scalar-const?") (jolt-nth args 1)) and__13__auto)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-get (jolt-nth args 1) (keyword #f "val")) (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))) jolt-nil))))) lookup-key))) + (def-var! "jolt.passes.inline" "lookup-key" (letrec ((lookup-key (lambda (node nm) (let fnrec3902 ((node node) (nm nm)) (if (jolt= (keyword #f "invoke") (jolt-get node (keyword #f "op"))) (let* ((f (jolt-get node (keyword #f "fn"))) (args (jolt-get node (keyword #f "args")))) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.fold" "kw-callee?") f))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= 1 (jolt-count args)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= (keyword #f "local") (jolt-get (jolt-nth args 0) (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt= nm (jolt-get (jolt-nth args 0) (keyword #f "name"))) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-get f (keyword #f "val")) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.fold" "get-callee?") f))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= 2 (jolt-count args)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= (keyword #f "local") (jolt-get (jolt-nth args 0) (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= nm (jolt-get (jolt-nth args 0) (keyword #f "name"))))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.fold" "scalar-const?") (jolt-nth args 1)) and__13__auto)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-get (jolt-nth args 1) (keyword #f "val")) (if (jolt-truthy? (keyword #f "else")) jolt-nil jolt-nil)))) jolt-nil))))) lookup-key))) (guard (e (#t #f)) (def-var! "jolt.passes.inline" "any-binding-named?" (letrec ((any-binding-named? (lambda (binds nm) (let fnrec3903 ((binds binds) (nm nm)) (let* ((i 0)) (let loop3904 ((i i)) (if (< i (jolt-count binds)) (if (jolt= nm (jolt-nth (jolt-nth binds i) 0)) #t (loop3904 (jolt-inc i))) #f))))))) any-binding-named?))) (guard (e (#t #f)) @@ -349,7 +353,7 @@ (guard (e (#t #f)) (def-var! "jolt.passes.inline" "subst-lookup" (letrec ((subst-lookup (lambda (node nm src) (let fnrec3942 ((node node) (nm nm) (src src)) (let* ((k (jolt-invoke (var-deref "jolt.passes.inline" "lookup-key") node nm))) (if (jolt-truthy? k) (jolt-invoke (var-deref "jolt.passes.inline" "src-val") src k) (jolt-invoke (var-deref "jolt.ir" "map-ir-children") (lambda (c) (let fnrec3943 ((c c)) (jolt-invoke subst-lookup c nm src))) node))))))) subst-lookup))) (guard (e (#t #f)) - (def-var! "jolt.passes.inline" "fold-kw-literal" (letrec ((fold-kw-literal (lambda (node) (let fnrec3944 ((node node)) (let* ((f (jolt-get node (keyword #f "fn"))) (args (jolt-get node (keyword #f "args")))) (if (jolt-truthy? (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get f (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "clojure.core" "keyword?") (jolt-get f (keyword #f "val"))))) (if (jolt-truthy? and__13__auto) (jolt= 1 (jolt-count args)) and__13__auto)) and__13__auto))) (let* ((m (jolt-nth args 0)) (k (jolt-get f (keyword #f "val")))) (if (jolt-truthy? (let* ((and__13__auto (jolt= (keyword #f "map") (jolt-get m (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.inline" "const-key-map?") m))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.inline" "all-vals-pure?") m) and__13__auto)) and__13__auto))) (begin (jolt-invoke (var-deref "jolt.passes.inline" "mark!")) (jolt-invoke (var-deref "jolt.passes.inline" "map-val") m k)) (let* ((rs (jolt-invoke (var-deref "jolt.passes.inline" "ctor-shape") m))) (if (jolt-truthy? (let* ((and__13__auto rs)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.inline" "ctor-all-args-pure?") m))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.inline" "field-index") (jolt-get rs (keyword #f "fields")) k) and__13__auto)) and__13__auto))) (begin (jolt-invoke (var-deref "jolt.passes.inline" "mark!")) (jolt-invoke (var-deref "jolt.passes.inline" "ctor-val") m rs k)) node)))) node)))))) fold-kw-literal))) + (def-var! "jolt.passes.inline" "fold-kw-literal" (letrec ((fold-kw-literal (lambda (node) (let fnrec3944 ((node node)) (let* ((f (jolt-get node (keyword #f "fn"))) (args (jolt-get node (keyword #f "args")))) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.fold" "kw-callee?") f))) (if (jolt-truthy? and__13__auto) (jolt= 1 (jolt-count args)) and__13__auto))) (let* ((m (jolt-nth args 0)) (k (jolt-get f (keyword #f "val")))) (if (jolt-truthy? (let* ((and__13__auto (jolt= (keyword #f "map") (jolt-get m (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.inline" "const-key-map?") m))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.inline" "all-vals-pure?") m) and__13__auto)) and__13__auto))) (begin (jolt-invoke (var-deref "jolt.passes.inline" "mark!")) (jolt-invoke (var-deref "jolt.passes.inline" "map-val") m k)) (let* ((rs (jolt-invoke (var-deref "jolt.passes.inline" "ctor-shape") m))) (if (jolt-truthy? (let* ((and__13__auto rs)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.inline" "ctor-all-args-pure?") m))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.inline" "field-index") (jolt-get rs (keyword #f "fields")) k) and__13__auto)) and__13__auto))) (begin (jolt-invoke (var-deref "jolt.passes.inline" "mark!")) (jolt-invoke (var-deref "jolt.passes.inline" "ctor-val") m rs k)) node)))) node)))))) fold-kw-literal))) (guard (e (#t #f)) (def-var! "jolt.passes.inline" "elim-let-structs" (letrec ((elim-let-structs (lambda (node) (let fnrec3945 ((node node)) (let* ((binds (jolt-get node (keyword #f "bindings"))) (n (jolt-count binds)) (body (jolt-get node (keyword #f "body")))) (let* ((i 0)) (let loop3946 ((i i)) (if (< i n) (let* ((b (jolt-nth binds i)) (nm (jolt-nth b 0)) (init (jolt-nth b 1)) (ismap (let* ((and__13__auto (jolt= (keyword #f "map") (jolt-get init (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.inline" "const-key-map?") init))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.inline" "all-vals-pure?") init) and__13__auto)) and__13__auto))) (rs (if (jolt-not ismap) (jolt-invoke (var-deref "jolt.passes.inline" "ctor-shape") init) jolt-nil)) (isrec (let* ((and__13__auto rs)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.inline" "ctor-all-args-pure?") init) and__13__auto)))) (if (jolt-truthy? (let* ((and__13__auto (let* ((or__14__auto ismap)) (if (jolt-truthy? or__14__auto) or__14__auto isrec)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not (jolt-invoke (var-deref "jolt.passes.inline" "any-binding-named?") (jolt-invoke (var-deref "clojure.core" "subvec") binds (jolt-inc i) n) nm)))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not (let* ((j (jolt-inc i))) (let loop3947 ((j j)) (if (< j n) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.inline" "local-escapes?") (jolt-nth (jolt-nth binds j) 1) nm)) #t (loop3947 (jolt-inc j))) #f)))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not (jolt-invoke (var-deref "jolt.passes.inline" "local-escapes?") body nm)))) (if (jolt-truthy? and__13__auto) (let* ((or__14__auto ismap)) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((_a$3952 (var-deref "jolt.passes.inline" "lookups-all-fields?")) (_a$3953 (jolt-conj (let* ((_a$3949 (var-deref "clojure.core" "mapv")) (_a$3950 (lambda (bb) (let fnrec3948 ((bb bb)) (jolt-nth bb 1)))) (_a$3951 (jolt-invoke (var-deref "clojure.core" "subvec") binds (jolt-inc i) n))) (jolt-invoke _a$3949 _a$3950 _a$3951)) body)) (_a$3954 nm) (_a$3955 (jolt-get rs (keyword #f "fields")))) (jolt-invoke _a$3952 _a$3953 _a$3954 _a$3955)))) and__13__auto)) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((head (jolt-invoke (var-deref "clojure.core" "subvec") binds 0 i)) (tail (let* ((_a$3959 (var-deref "clojure.core" "mapv")) (_a$3960 (lambda (bb) (let fnrec3956 ((bb bb)) (let* ((_o$3957 (jolt-nth bb 0)) (_o$3958 (jolt-invoke (var-deref "jolt.passes.inline" "subst-lookup") (jolt-nth bb 1) nm init))) (jolt-vector _o$3957 _o$3958))))) (_a$3961 (jolt-invoke (var-deref "clojure.core" "subvec") binds (jolt-inc i) n))) (jolt-invoke _a$3959 _a$3960 _a$3961))) (newbinds (jolt-reduce jolt-conj head tail)) (newbody (jolt-invoke (var-deref "jolt.passes.inline" "subst-lookup") body nm init))) (begin (jolt-invoke (var-deref "jolt.passes.inline" "mark!")) (if (jolt= 0 (jolt-count newbinds)) newbody (jolt-assoc node (keyword #f "bindings") newbinds (keyword #f "body") newbody)))) (loop3946 (jolt-inc i)))) node)))))))) elim-let-structs))) (guard (e (#t #f)) @@ -451,7 +455,7 @@ (guard (e (#t #f)) (def-var! "jolt.passes.types" "infer-fn-seeded" (letrec ((infer-fn-seeded (lambda (node seeds tenv env) (let fnrec3110 ((node node) (seeds seeds) (tenv tenv) (env env)) (let* ((res (let* ((_a$3121 (var-deref "clojure.core" "mapv")) (_a$3122 (lambda (a) (let fnrec3111 ((a a)) (let* ((params (jolt-get a (keyword #f "params"))) (pe (let* ((_a$3116 (lambda (e i) (let fnrec3112 ((e e) (i i)) (let* ((_a$3113 e) (_a$3114 (jolt-nth params i)) (_a$3115 (let* ((s (jolt-get seeds i))) (if (jolt-truthy? s) s (keyword #f "any"))))) (jolt-assoc _a$3113 _a$3114 _a$3115))))) (_a$3117 tenv) (_a$3118 (jolt-range (jolt-count params)))) (jolt-reduce _a$3116 _a$3117 _a$3118))) (pe (if (jolt-truthy? (jolt-get a (keyword #f "rest"))) (jolt-assoc pe (jolt-get a (keyword #f "rest")) (keyword #f "any")) pe)) (br (jolt-invoke (var-deref "jolt.passes.types" "infer") (jolt-get a (keyword #f "body")) pe env))) (let* ((_o$3119 (jolt-nth br 0)) (_o$3120 (jolt-assoc a (keyword #f "body") (jolt-nth br 1)))) (jolt-vector _o$3119 _o$3120)))))) (_a$3123 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$3121 _a$3122 _a$3123))) (rets (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3124 ((r r)) (jolt-nth r 0))) res)) (ret (if (jolt-empty? rets) (keyword #f "any") (let* ((_a$3125 (var-deref "jolt.passes.types.lattice" "join")) (_a$3126 (jolt-first rets)) (_a$3127 (jolt-rest rets))) (jolt-reduce _a$3125 _a$3126 _a$3127))))) (let* ((_o$3129 ret) (_o$3130 (jolt-assoc node (keyword #f "arities") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3128 ((r r)) (jolt-nth r 1))) res)))) (jolt-vector _o$3129 _o$3130))))))) infer-fn-seeded))) (guard (e (#t #f)) - (def-var! "jolt.passes.types" "infer" (letrec ((infer (lambda (node tenv env) (let fnrec3131 ((node node) (tenv tenv) (env env)) (let* ((op (jolt-get node (keyword #f "op")))) (if (jolt= op (keyword #f "const")) (let* ((_o$3132 (let* ((v (jolt-get node (keyword #f "val")))) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "number?") v)) (keyword #f "num") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") v)) (keyword #f "str") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "keyword?") v)) (keyword #f "kw") (if (jolt-truthy? (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "nil?") v))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt= #f v)))) (keyword #f "any") (if (jolt-truthy? (keyword #f "else")) (keyword #f "truthy") jolt-nil))))))) (_o$3133 node)) (jolt-vector _o$3132 _o$3133)) (if (jolt= op (keyword #f "local")) (let* ((t (jolt-get tenv (jolt-get node (keyword #f "name"))))) (let* ((_o$3134 (if (jolt-truthy? t) t (keyword #f "any"))) (_o$3135 (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-safe?") t)) (let* ((n (jolt-assoc node (keyword #f "hint") (keyword #f "struct")))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "type-shape") t)) (jolt-assoc n (keyword #f "shape") (jolt-invoke (var-deref "jolt.passes.types.lattice" "type-shape") t)) n)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") t)) (jolt-assoc node (keyword #f "hint") (keyword #f "vector")) (if (jolt-truthy? (keyword #f "else")) node jolt-nil))))) (jolt-vector _o$3134 _o$3135))) (if (jolt= op (keyword #f "map")) (let* ((pairs (jolt-get node (keyword #f "pairs"))) (res (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (pr) (let fnrec3136 ((pr pr)) (let* ((kr (jolt-invoke infer (jolt-nth pr 0) tenv env)) (vr (jolt-invoke infer (jolt-nth pr 1) tenv env))) (let* ((_o$3137 (jolt-nth kr 1)) (_o$3138 (jolt-nth vr 1)) (_o$3139 (jolt-nth vr 0)) (_o$3140 (jolt-get (jolt-nth pr 0) (keyword #f "val")))) (jolt-vector _o$3137 _o$3138 _o$3139 _o$3140))))) pairs)) (struct? (let* ((and__13__auto (> (jolt-count res) 0))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "clojure.core" "every?") (lambda (pr) (let fnrec3141 ((pr pr)) (jolt-invoke (var-deref "jolt.passes.fold" "scalar-const?") (jolt-nth pr 0)))) pairs))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "every?") (lambda (r) (let fnrec3142 ((r r)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "truthy-type?") (jolt-nth r 2)))) res) and__13__auto)) and__13__auto))) (base (if (jolt-truthy? struct?) (jolt-invoke (var-deref "jolt.passes.types.lattice" "cap") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-struct") (let* ((_a$3147 (lambda (m r) (let fnrec3143 ((m m) (r r)) (let* ((_a$3144 m) (_a$3145 (jolt-nth r 3)) (_a$3146 (jolt-nth r 2))) (jolt-assoc _a$3144 _a$3145 _a$3146))))) (_a$3148 (jolt-hash-map)) (_a$3149 res)) (jolt-reduce _a$3147 _a$3148 _a$3149))) (var-deref "jolt.passes.types.lattice" "type-depth")) jolt-nil)) (shp (if (jolt-truthy? (let* ((and__13__auto (jolt-get env (keyword #f "map-shapes?")))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto base)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-type?") base) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.passes.types.lattice" "shape-order") (jolt-keys (jolt-invoke (var-deref "jolt.passes.types.lattice" "sfields") base))) jolt-nil)) (t (if (jolt-truthy? base) (if (jolt-truthy? shp) (jolt-assoc base (keyword #f "shape") shp) base) (keyword #f "any"))) (node_PRIME_ (jolt-assoc node (keyword #f "pairs") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3150 ((r r)) (let* ((_o$3151 (jolt-nth r 0)) (_o$3152 (jolt-nth r 1))) (jolt-vector _o$3151 _o$3152)))) res)))) (let* ((_o$3153 t) (_o$3154 (if (jolt-truthy? shp) (jolt-assoc node_PRIME_ (keyword #f "shape") shp) node_PRIME_))) (jolt-vector _o$3153 _o$3154))) (if (jolt= op (keyword #f "vector")) (let* ((irs (let* ((_a$3156 (var-deref "clojure.core" "mapv")) (_a$3157 (lambda (x) (let fnrec3155 ((x x)) (jolt-invoke infer x tenv env)))) (_a$3158 (jolt-get node (keyword #f "items")))) (jolt-invoke _a$3156 _a$3157 _a$3158))) (ets (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3159 ((r r)) (jolt-nth r 0))) irs)) (el (if (jolt-empty? ets) (keyword #f "any") (let* ((_a$3160 (var-deref "jolt.passes.types.lattice" "join")) (_a$3161 (jolt-first ets)) (_a$3162 (jolt-rest ets))) (jolt-reduce _a$3160 _a$3161 _a$3162))))) (let* ((_o$3164 (jolt-invoke (var-deref "jolt.passes.types.lattice" "cap") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") el) (var-deref "jolt.passes.types.lattice" "type-depth"))) (_o$3165 (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3163 ((r r)) (jolt-nth r 1))) irs)))) (jolt-vector _o$3164 _o$3165))) (if (jolt= op (keyword #f "set")) (let* ((irs (let* ((_a$3167 (var-deref "clojure.core" "mapv")) (_a$3168 (lambda (x) (let fnrec3166 ((x x)) (jolt-invoke infer x tenv env)))) (_a$3169 (jolt-get node (keyword #f "items")))) (jolt-invoke _a$3167 _a$3168 _a$3169))) (ets (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3170 ((r r)) (jolt-nth r 0))) irs)) (el (if (jolt-empty? ets) (keyword #f "any") (let* ((_a$3171 (var-deref "jolt.passes.types.lattice" "join")) (_a$3172 (jolt-first ets)) (_a$3173 (jolt-rest ets))) (jolt-reduce _a$3171 _a$3172 _a$3173))))) (let* ((_o$3175 (jolt-invoke (var-deref "jolt.passes.types.lattice" "cap") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-set") el) (var-deref "jolt.passes.types.lattice" "type-depth"))) (_o$3176 (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3174 ((r r)) (jolt-nth r 1))) irs)))) (jolt-vector _o$3175 _o$3176))) (if (jolt= op (keyword #f "if")) (let* ((tr (jolt-invoke infer (jolt-get node (keyword #f "test")) tenv env)) (thn (jolt-invoke infer (jolt-get node (keyword #f "then")) tenv env)) (els (jolt-invoke infer (jolt-get node (keyword #f "else")) tenv env))) (let* ((_o$3187 (let* ((_a$3177 (var-deref "jolt.passes.types.lattice" "join")) (_a$3178 (jolt-nth thn 0)) (_a$3179 (jolt-nth els 0))) (jolt-invoke _a$3177 _a$3178 _a$3179))) (_o$3188 (let* ((_a$3180 node) (_a$3181 (keyword #f "test")) (_a$3182 (jolt-nth tr 1)) (_a$3183 (keyword #f "then")) (_a$3184 (jolt-nth thn 1)) (_a$3185 (keyword #f "else")) (_a$3186 (jolt-nth els 1))) (jolt-assoc _a$3180 _a$3181 _a$3182 _a$3183 _a$3184 _a$3185 _a$3186)))) (jolt-vector _o$3187 _o$3188))) (if (jolt= op (keyword #f "do")) (let* ((stmts (let* ((_a$3190 (var-deref "clojure.core" "mapv")) (_a$3191 (lambda (s) (let fnrec3189 ((s s)) (jolt-nth (jolt-invoke infer s tenv env) 1)))) (_a$3192 (jolt-get node (keyword #f "statements")))) (jolt-invoke _a$3190 _a$3191 _a$3192))) (r (jolt-invoke infer (jolt-get node (keyword #f "ret")) tenv env))) (let* ((_o$3193 (jolt-nth r 0)) (_o$3194 (jolt-assoc node (keyword #f "statements") stmts (keyword #f "ret") (jolt-nth r 1)))) (jolt-vector _o$3193 _o$3194))) (if (jolt= op (keyword #f "throw")) (let* ((_o$3195 (keyword #f "any")) (_o$3196 (jolt-assoc node (keyword #f "expr") (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "expr")) tenv env) 1)))) (jolt-vector _o$3195 _o$3196)) (if (jolt= op (keyword #f "var")) (begin (let* ((_a$3197 (var-deref "clojure.core" "swap!")) (_a$3198 (jolt-get env (keyword #f "escapes"))) (_a$3199 jolt-conj) (_a$3200 (jolt-invoke (var-deref "jolt.passes.types" "var-key") node))) (jolt-invoke _a$3197 _a$3198 _a$3199 _a$3200)) (let* ((_o$3203 (let* ((vt (let* ((_a$3201 (jolt-get env (keyword #f "vtypes"))) (_a$3202 (jolt-invoke (var-deref "jolt.passes.types" "var-key") node))) (jolt-get _a$3201 _a$3202)))) (if (jolt-truthy? vt) vt (keyword #f "any")))) (_o$3204 node)) (jolt-vector _o$3203 _o$3204))) (if (jolt= op (keyword #f "invoke")) (let* ((fnode (jolt-get node (keyword #f "fn"))) (iscall-var (jolt= (keyword #f "var") (jolt-get fnode (keyword #f "op")))) (cn (if (jolt-truthy? (let* ((and__13__auto iscall-var)) (if (jolt-truthy? and__13__auto) (jolt= "clojure.core" (jolt-get fnode (keyword #f "ns"))) and__13__auto))) (jolt-get fnode (keyword #f "name")) jolt-nil)) (args (jolt-get node (keyword #f "args"))) (n (jolt-count args))) (if (jolt-truthy? (let* ((and__13__auto iscall-var)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-contains? (var-deref "jolt.passes.types" "fold-preds") cn))) (if (jolt-truthy? and__13__auto) (jolt= n 1) and__13__auto)) and__13__auto))) (let* ((ar (jolt-invoke infer (jolt-nth args 0) tenv env)) (v (jolt-invoke (var-deref "jolt.passes.types" "pred-on") cn (jolt-nth ar 0)))) (if (jolt-truthy? (let* ((and__13__auto (jolt-not (jolt-invoke (var-deref "clojure.core" "nil?") v)))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types" "pure-node?") (jolt-nth ar 1)) and__13__auto))) (let* ((_o$3209 (keyword #f "any")) (_o$3210 (let* ((_o$3205 (keyword #f "op")) (_o$3206 (keyword #f "const")) (_o$3207 (keyword #f "val")) (_o$3208 v)) (jolt-hash-map _o$3205 _o$3206 _o$3207 _o$3208)))) (jolt-vector _o$3209 _o$3210)) (let* ((_o$3211 (jolt-invoke (var-deref "jolt.passes.types" "call-ret-type") fnode env)) (_o$3212 (jolt-assoc node (keyword #f "args") (jolt-vector (jolt-nth ar 1))))) (jolt-vector _o$3211 _o$3212)))) (if (jolt-truthy? (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get fnode (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "clojure.core" "keyword?") (jolt-get fnode (keyword #f "val"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 1))) (if (jolt-truthy? and__13__auto) (<= n 2) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((mr (jolt-invoke infer (jolt-nth args 0) tenv env)) (mt (jolt-nth mr 0)) (msub (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-safe?") mt)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mark-struct") (jolt-nth mr 1) mt) (jolt-nth mr 1))) (ft (jolt-invoke (var-deref "jolt.passes.types.lattice" "field-type") mt (jolt-get fnode (keyword #f "val")))) (dr (if (jolt= n 2) (jolt-invoke infer (jolt-nth args 1) tenv env) jolt-nil))) (let* ((_o$3215 (if (jolt-truthy? dr) (jolt-invoke (var-deref "jolt.passes.types.lattice" "join") ft (jolt-nth dr 0)) ft)) (_o$3216 (jolt-assoc node (keyword #f "args") (if (jolt-truthy? dr) (let* ((_o$3213 msub) (_o$3214 (jolt-nth dr 1))) (jolt-vector _o$3213 _o$3214)) (jolt-vector msub))))) (jolt-vector _o$3215 _o$3216))) (if (jolt-truthy? (let* ((and__13__auto (let* ((or__14__auto (let* ((and__13__auto (jolt= (keyword #f "var") (jolt-get fnode (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "clojure.core" (jolt-get fnode (keyword #f "ns"))))) (if (jolt-truthy? and__13__auto) (jolt= "get" (jolt-get fnode (keyword #f "name"))) and__13__auto)) and__13__auto)))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((and__13__auto (jolt= (keyword #f "host") (jolt-get fnode (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt= "get" (jolt-get fnode (keyword #f "name"))) and__13__auto)))))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 2))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get (jolt-nth args 1) (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "keyword?") (jolt-get (jolt-nth args 1) (keyword #f "val"))) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((mr (jolt-invoke infer (jolt-nth args 0) tenv env)) (mt (jolt-nth mr 0)) (msub (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-safe?") mt)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mark-struct") (jolt-nth mr 1) mt) (jolt-nth mr 1))) (kr (jolt-invoke infer (jolt-nth args 1) tenv env)) (ft (jolt-invoke (var-deref "jolt.passes.types.lattice" "field-type") mt (jolt-get (jolt-nth args 1) (keyword #f "val")))) (dr (if (jolt= n 3) (jolt-invoke infer (jolt-nth args 2) tenv env) jolt-nil))) (let* ((_o$3222 (if (jolt-truthy? dr) (jolt-invoke (var-deref "jolt.passes.types.lattice" "join") ft (jolt-nth dr 0)) ft)) (_o$3223 (jolt-assoc node (keyword #f "args") (if (jolt-truthy? dr) (let* ((_o$3217 msub) (_o$3218 (jolt-nth kr 1)) (_o$3219 (jolt-nth dr 1))) (jolt-vector _o$3217 _o$3218 _o$3219)) (let* ((_o$3220 msub) (_o$3221 (jolt-nth kr 1))) (jolt-vector _o$3220 _o$3221)))))) (jolt-vector _o$3222 _o$3223))) (if (jolt-truthy? (let* ((and__13__auto (jolt= cn "reduce"))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 2))) (if (jolt-truthy? and__13__auto) (jolt= (keyword #f "fn") (jolt-get (jolt-nth args 0) (keyword #f "op"))) and__13__auto)) and__13__auto))) (let* ((three (>= n 3)) (coll-r (jolt-invoke infer (jolt-nth args (if (jolt-truthy? three) 2 1)) tenv env)) (init-r (if (jolt-truthy? three) (jolt-invoke infer (jolt-nth args 1) tenv env) jolt-nil)) (et (let* ((ct (jolt-nth coll-r 0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") ct)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") ct) (keyword #f "any")))) (init-t (if (jolt-truthy? init-r) (jolt-nth init-r 0) (keyword #f "any"))) (fn-r (let* ((_a$3228 (var-deref "jolt.passes.types" "infer-fn-seeded")) (_a$3229 (jolt-nth args 0)) (_a$3230 (let* ((_o$3224 0) (_o$3225 init-t) (_o$3226 1) (_o$3227 et)) (jolt-hash-map _o$3224 _o$3225 _o$3226 _o$3227))) (_a$3231 tenv) (_a$3232 env)) (jolt-invoke _a$3228 _a$3229 _a$3230 _a$3231 _a$3232)))) (let* ((_o$3238 (jolt-invoke (var-deref "jolt.passes.types.lattice" "join") init-t (jolt-nth fn-r 0))) (_o$3239 (jolt-assoc node (keyword #f "args") (if (jolt-truthy? three) (let* ((_o$3233 (jolt-nth fn-r 1)) (_o$3234 (jolt-nth init-r 1)) (_o$3235 (jolt-nth coll-r 1))) (jolt-vector _o$3233 _o$3234 _o$3235)) (let* ((_o$3236 (jolt-nth fn-r 1)) (_o$3237 (jolt-nth coll-r 1))) (jolt-vector _o$3236 _o$3237)))))) (jolt-vector _o$3238 _o$3239))) (if (jolt-truthy? (let* ((and__13__auto cn)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-get (var-deref "jolt.passes.types" "hof-table") cn))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 2))) (if (jolt-truthy? and__13__auto) (jolt= (keyword #f "fn") (jolt-get (jolt-nth args 0) (keyword #f "op"))) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((coll-r (jolt-invoke infer (jolt-nth args 1) tenv env)) (et (let* ((ct (jolt-nth coll-r 0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") ct)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") ct) (keyword #f "any")))) (fn-r (let* ((_a$3242 (var-deref "jolt.passes.types" "infer-fn-seeded")) (_a$3243 (jolt-nth args 0)) (_a$3244 (let* ((_o$3240 (jolt-get (jolt-get (var-deref "jolt.passes.types" "hof-table") cn) (keyword #f "epos"))) (_o$3241 et)) (jolt-hash-map _o$3240 _o$3241))) (_a$3245 tenv) (_a$3246 env)) (jolt-invoke _a$3242 _a$3243 _a$3244 _a$3245 _a$3246))) (rt (if (jolt= cn "mapv") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (jolt-nth fn-r 0)) (if (jolt= cn "filterv") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") et) (if (jolt-truthy? (keyword #f "else")) (keyword #f "any") jolt-nil))))) (let* ((_o$3249 rt) (_o$3250 (jolt-assoc node (keyword #f "args") (let* ((_o$3247 (jolt-nth fn-r 1)) (_o$3248 (jolt-nth coll-r 1))) (jolt-vector _o$3247 _o$3248))))) (jolt-vector _o$3249 _o$3250))) (if (jolt-truthy? (let* ((and__13__auto (let* ((or__14__auto (jolt= cn "conj"))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt= cn "into"))))) (if (jolt-truthy? and__13__auto) (>= n 1) and__13__auto))) (let* ((ares (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (a) (let fnrec3251 ((a a)) (jolt-invoke infer a tenv env))) args)) (base (jolt-nth (jolt-nth ares 0) 0)) (rest-ts (let* ((_a$3253 (var-deref "clojure.core" "mapv")) (_a$3254 (lambda (r) (let fnrec3252 ((r r)) (jolt-nth r 0)))) (_a$3255 (jolt-rest ares))) (jolt-invoke _a$3253 _a$3254 _a$3255))) (rt (if (jolt-truthy? (let* ((and__13__auto (jolt= cn "conj"))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") base) and__13__auto))) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (jolt-reduce (var-deref "jolt.passes.types.lattice" "join") (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") base) rest-ts)) (if (jolt-truthy? (let* ((and__13__auto (jolt= cn "into"))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") base))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= 2 n))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") (jolt-nth rest-ts 0)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (let* ((_a$3256 (var-deref "jolt.passes.types.lattice" "join")) (_a$3257 (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") base)) (_a$3258 (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") (jolt-nth rest-ts 0)))) (jolt-invoke _a$3256 _a$3257 _a$3258))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.passes.types" "call-ret-type") fnode env) jolt-nil))))) (let* ((_o$3260 rt) (_o$3261 (jolt-assoc node (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3259 ((r r)) (jolt-nth r 1))) ares)))) (jolt-vector _o$3260 _o$3261))) (if (jolt-truthy? (keyword #f "else")) (let* ((fr (if (jolt-not iscall-var) (jolt-invoke infer fnode tenv env) jolt-nil)) (fnode_PRIME_ (if (jolt-truthy? iscall-var) fnode (jolt-nth fr 1))) (callee-t (if (jolt-truthy? iscall-var) (let* ((_a$3262 (jolt-get env (keyword #f "vtypes"))) (_a$3263 (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode))) (jolt-get _a$3262 _a$3263)) (jolt-nth fr 0))) (ares (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (a) (let fnrec3264 ((a a)) (jolt-invoke infer a tenv env))) args))) (begin (if (jolt-truthy? iscall-var) (let* ((_a$3268 (var-deref "clojure.core" "swap!")) (_a$3269 (jolt-get env (keyword #f "calls"))) (_a$3270 jolt-conj) (_a$3271 (let* ((_o$3266 (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode)) (_o$3267 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3265 ((r r)) (jolt-nth r 0))) ares))) (jolt-vector _o$3266 _o$3267)))) (jolt-invoke _a$3268 _a$3269 _a$3270 _a$3271)) jolt-nil) (if (jolt-truthy? (jolt-get env (keyword #f "checking?"))) (let* ((ats (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3272 ((r r)) (jolt-nth r 0))) ares)) (pos (jolt-get node (keyword #f "pos")))) (begin (if (jolt-truthy? cn) (jolt-invoke (var-deref "jolt.passes.types" "check-invoke") cn args ats pos env) jolt-nil) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types" "not-callable?") callee-t)) (let* ((_a$3281 (var-deref "clojure.core" "swap!")) (_a$3282 (jolt-get env (keyword #f "diags"))) (_a$3283 jolt-conj) (_a$3284 (let* ((_o$3273 (keyword #f "op")) (_o$3274 (keyword #f "call")) (_o$3275 (keyword #f "type")) (_o$3276 (jolt-invoke (var-deref "jolt.passes.types" "type-name") callee-t)) (_o$3277 (keyword #f "pos")) (_o$3278 pos) (_o$3279 (keyword #f "msg")) (_o$3280 (jolt-invoke (var-deref "clojure.core" "str") "cannot call " (jolt-invoke (var-deref "jolt.passes.types" "type-name") callee-t) " as a function"))) (jolt-hash-map _o$3273 _o$3274 _o$3275 _o$3276 _o$3277 _o$3278 _o$3279 _o$3280)))) (jolt-invoke _a$3281 _a$3282 _a$3283 _a$3284)) jolt-nil) (if (jolt-truthy? (let* ((and__13__auto (jolt-get env (keyword #f "strict?")))) (if (jolt-truthy? and__13__auto) iscall-var and__13__auto))) (let* ((k (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode)) (usig (jolt-get (jolt-invoke (var-deref "clojure.core" "deref") (jolt-get env (keyword #f "user-sigs"))) k))) (if (jolt-truthy? usig) (jolt-invoke (var-deref "jolt.passes.types" "check-user-call") k usig ats pos env) jolt-nil)) jolt-nil))) jolt-nil) (let* ((pm (let* ((and__13__auto iscall-var)) (if (jolt-truthy? and__13__auto) (let* ((_a$3285 (jolt-get env (keyword #f "protocol-methods"))) (_a$3286 (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode))) (jolt-get _a$3285 _a$3286)) and__13__auto))) (rtype (if (jolt-truthy? (let* ((and__13__auto pm)) (if (jolt-truthy? and__13__auto) (jolt-pos? n) and__13__auto))) (jolt-get (jolt-nth (jolt-nth ares 0) 0) (keyword #f "type")) jolt-nil)) (base (jolt-assoc node (keyword #f "fn") fnode_PRIME_ (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3287 ((r r)) (jolt-nth r 1))) ares)))) (let* ((_o$3295 (if (jolt= cn "range") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (keyword #f "num")) (if (jolt-truthy? (let* ((and__13__auto cn)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-contains? (var-deref "jolt.passes.types" "elem-fns") cn))) (if (jolt-truthy? and__13__auto) (> n 0) and__13__auto)) and__13__auto))) (let* ((a0 (jolt-nth (jolt-nth ares 0) 0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") a0)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") a0) (keyword #f "any"))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.passes.types" "call-ret-type") fnode env) jolt-nil)))) (_o$3296 (if (jolt-truthy? rtype) (let* ((_a$3288 base) (_a$3289 (keyword #f "devirt-type")) (_a$3290 rtype) (_a$3291 (keyword #f "devirt-proto")) (_a$3292 (jolt-nth pm 0)) (_a$3293 (keyword #f "devirt-method")) (_a$3294 (jolt-nth pm 1))) (jolt-assoc _a$3288 _a$3289 _a$3290 _a$3291 _a$3292 _a$3293 _a$3294)) base))) (jolt-vector _o$3295 _o$3296))))) jolt-nil)))))))) (if (jolt= op (keyword #f "let")) (let* ((res (let* ((_a$3307 (lambda (acc b) (let fnrec3297 ((acc acc) (b b)) (let* ((te (jolt-nth acc 0)) (binds (jolt-nth acc 1)) (ir (jolt-invoke infer (jolt-nth b 1) te env))) (let* ((_o$3303 (let* ((_a$3298 te) (_a$3299 (jolt-nth b 0)) (_a$3300 (jolt-nth ir 0))) (jolt-assoc _a$3298 _a$3299 _a$3300))) (_o$3304 (jolt-conj binds (let* ((_o$3301 (jolt-nth b 0)) (_o$3302 (jolt-nth ir 1))) (jolt-vector _o$3301 _o$3302))))) (jolt-vector _o$3303 _o$3304)))))) (_a$3308 (let* ((_o$3305 tenv) (_o$3306 (jolt-vector))) (jolt-vector _o$3305 _o$3306))) (_a$3309 (jolt-get node (keyword #f "bindings")))) (jolt-reduce _a$3307 _a$3308 _a$3309))) (br (let* ((_a$3310 infer) (_a$3311 (jolt-get node (keyword #f "body"))) (_a$3312 (jolt-nth res 0)) (_a$3313 env)) (jolt-invoke _a$3310 _a$3311 _a$3312 _a$3313)))) (let* ((_o$3319 (jolt-nth br 0)) (_o$3320 (let* ((_a$3314 node) (_a$3315 (keyword #f "bindings")) (_a$3316 (jolt-nth res 1)) (_a$3317 (keyword #f "body")) (_a$3318 (jolt-nth br 1))) (jolt-assoc _a$3314 _a$3315 _a$3316 _a$3317 _a$3318)))) (jolt-vector _o$3319 _o$3320))) (if (jolt= op (keyword #f "loop")) (let* ((_o$3332 (keyword #f "any")) (_o$3333 (let* ((_a$3327 node) (_a$3328 (keyword #f "bindings")) (_a$3329 (let* ((_a$3324 (var-deref "clojure.core" "mapv")) (_a$3325 (lambda (b) (let fnrec3321 ((b b)) (let* ((_o$3322 (jolt-nth b 0)) (_o$3323 (jolt-nth (jolt-invoke infer (jolt-nth b 1) tenv env) 1))) (jolt-vector _o$3322 _o$3323))))) (_a$3326 (jolt-get node (keyword #f "bindings")))) (jolt-invoke _a$3324 _a$3325 _a$3326))) (_a$3330 (keyword #f "body")) (_a$3331 (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "body")) tenv env) 1))) (jolt-assoc _a$3327 _a$3328 _a$3329 _a$3330 _a$3331)))) (jolt-vector _o$3332 _o$3333)) (if (jolt= op (keyword #f "recur")) (let* ((_o$3338 (keyword #f "any")) (_o$3339 (jolt-assoc node (keyword #f "args") (let* ((_a$3335 (var-deref "clojure.core" "mapv")) (_a$3336 (lambda (a) (let fnrec3334 ((a a)) (jolt-nth (jolt-invoke infer a tenv env) 1)))) (_a$3337 (jolt-get node (keyword #f "args")))) (jolt-invoke _a$3335 _a$3336 _a$3337))))) (jolt-vector _o$3338 _o$3339)) (if (jolt= op (keyword #f "fn")) (let* ((_o$3355 (keyword #f "any")) (_o$3356 (jolt-assoc node (keyword #f "arities") (let* ((_a$3352 (var-deref "clojure.core" "mapv")) (_a$3353 (lambda (a) (let fnrec3340 ((a a)) (let* ((shapes (jolt-get env (keyword #f "record-shapes"))) (phm (let* ((_a$3345 (lambda (m pr) (let fnrec3341 ((m m) (pr pr)) (let* ((_a$3342 m) (_a$3343 (jolt-nth pr 0)) (_a$3344 (jolt-nth pr 1))) (jolt-assoc _a$3342 _a$3343 _a$3344))))) (_a$3346 (jolt-hash-map)) (_a$3347 (jolt-get a (keyword #f "phints")))) (jolt-reduce _a$3345 _a$3346 _a$3347))) (pe (let* ((_a$3349 (lambda (e p) (let fnrec3348 ((e e) (p p)) (jolt-assoc e p (let* ((ent (jolt-get shapes (jolt-get phm p)))) (if (jolt-truthy? ent) (jolt-invoke (var-deref "jolt.passes.types" "record-type-from-entry") ent (var-deref "jolt.passes.types.lattice" "type-depth") shapes) (keyword #f "any"))))))) (_a$3350 tenv) (_a$3351 (jolt-get a (keyword #f "params")))) (jolt-reduce _a$3349 _a$3350 _a$3351))) (pe (if (jolt-truthy? (jolt-get a (keyword #f "rest"))) (jolt-assoc pe (jolt-get a (keyword #f "rest")) (keyword #f "any")) pe))) (jolt-assoc a (keyword #f "body") (jolt-nth (jolt-invoke infer (jolt-get a (keyword #f "body")) pe env) 1)))))) (_a$3354 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$3352 _a$3353 _a$3354))))) (jolt-vector _o$3355 _o$3356)) (if (jolt= op (keyword #f "def")) (begin (if (jolt-truthy? (jolt-get env (keyword #f "checking?"))) (jolt-invoke (var-deref "jolt.passes.types" "register-user-fn!") node env) jolt-nil) (let* ((_o$3357 (keyword #f "any")) (_o$3358 (jolt-assoc node (keyword #f "init") (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "init")) tenv env) 1)))) (jolt-vector _o$3357 _o$3358))) (if (jolt= op (keyword #f "try")) (let* ((_o$3366 (keyword #f "any")) (_o$3367 (let* ((_a$3359 node) (_a$3360 (keyword #f "body")) (_a$3361 (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "body")) tenv env) 1)) (_a$3362 (keyword #f "catch-body")) (_a$3363 (if (jolt-truthy? (jolt-get node (keyword #f "catch-body"))) (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "catch-body")) tenv env) 1) jolt-nil)) (_a$3364 (keyword #f "finally")) (_a$3365 (if (jolt-truthy? (jolt-get node (keyword #f "finally"))) (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "finally")) tenv env) 1) jolt-nil))) (jolt-assoc _a$3359 _a$3360 _a$3361 _a$3362 _a$3363 _a$3364 _a$3365)))) (jolt-vector _o$3366 _o$3367)) (if (jolt-truthy? (keyword #f "else")) (let* ((_o$3368 (keyword #f "any")) (_o$3369 node)) (jolt-vector _o$3368 _o$3369)) jolt-nil)))))))))))))))))))))) infer))) + (def-var! "jolt.passes.types" "infer" (letrec ((infer (lambda (node tenv env) (let fnrec3131 ((node node) (tenv tenv) (env env)) (let* ((op (jolt-get node (keyword #f "op")))) (if (jolt= op (keyword #f "const")) (let* ((_o$3132 (let* ((v (jolt-get node (keyword #f "val")))) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "number?") v)) (keyword #f "num") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "string?") v)) (keyword #f "str") (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "keyword?") v)) (keyword #f "kw") (if (jolt-truthy? (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "nil?") v))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt= #f v)))) (keyword #f "any") (if (jolt-truthy? (keyword #f "else")) (keyword #f "truthy") jolt-nil))))))) (_o$3133 node)) (jolt-vector _o$3132 _o$3133)) (if (jolt= op (keyword #f "local")) (let* ((t (jolt-get tenv (jolt-get node (keyword #f "name"))))) (let* ((_o$3134 (if (jolt-truthy? t) t (keyword #f "any"))) (_o$3135 (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-safe?") t)) (let* ((n (jolt-assoc node (keyword #f "hint") (keyword #f "struct")))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "type-shape") t)) (jolt-assoc n (keyword #f "shape") (jolt-invoke (var-deref "jolt.passes.types.lattice" "type-shape") t)) n)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") t)) (jolt-assoc node (keyword #f "hint") (keyword #f "vector")) (if (jolt-truthy? (keyword #f "else")) node jolt-nil))))) (jolt-vector _o$3134 _o$3135))) (if (jolt= op (keyword #f "map")) (let* ((pairs (jolt-get node (keyword #f "pairs"))) (res (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (pr) (let fnrec3136 ((pr pr)) (let* ((kr (jolt-invoke infer (jolt-nth pr 0) tenv env)) (vr (jolt-invoke infer (jolt-nth pr 1) tenv env))) (let* ((_o$3137 (jolt-nth kr 1)) (_o$3138 (jolt-nth vr 1)) (_o$3139 (jolt-nth vr 0)) (_o$3140 (jolt-get (jolt-nth pr 0) (keyword #f "val")))) (jolt-vector _o$3137 _o$3138 _o$3139 _o$3140))))) pairs)) (struct? (let* ((and__13__auto (> (jolt-count res) 0))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "clojure.core" "every?") (lambda (pr) (let fnrec3141 ((pr pr)) (jolt-invoke (var-deref "jolt.passes.fold" "scalar-const?") (jolt-nth pr 0)))) pairs))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "every?") (lambda (r) (let fnrec3142 ((r r)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "truthy-type?") (jolt-nth r 2)))) res) and__13__auto)) and__13__auto))) (base (if (jolt-truthy? struct?) (jolt-invoke (var-deref "jolt.passes.types.lattice" "cap") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-struct") (let* ((_a$3147 (lambda (m r) (let fnrec3143 ((m m) (r r)) (let* ((_a$3144 m) (_a$3145 (jolt-nth r 3)) (_a$3146 (jolt-nth r 2))) (jolt-assoc _a$3144 _a$3145 _a$3146))))) (_a$3148 (jolt-hash-map)) (_a$3149 res)) (jolt-reduce _a$3147 _a$3148 _a$3149))) (var-deref "jolt.passes.types.lattice" "type-depth")) jolt-nil)) (shp (if (jolt-truthy? (let* ((and__13__auto (jolt-get env (keyword #f "map-shapes?")))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto base)) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-type?") base) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.passes.types.lattice" "shape-order") (jolt-keys (jolt-invoke (var-deref "jolt.passes.types.lattice" "sfields") base))) jolt-nil)) (t (if (jolt-truthy? base) (if (jolt-truthy? shp) (jolt-assoc base (keyword #f "shape") shp) base) (keyword #f "any"))) (node_PRIME_ (jolt-assoc node (keyword #f "pairs") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3150 ((r r)) (let* ((_o$3151 (jolt-nth r 0)) (_o$3152 (jolt-nth r 1))) (jolt-vector _o$3151 _o$3152)))) res)))) (let* ((_o$3153 t) (_o$3154 (if (jolt-truthy? shp) (jolt-assoc node_PRIME_ (keyword #f "shape") shp) node_PRIME_))) (jolt-vector _o$3153 _o$3154))) (if (jolt= op (keyword #f "vector")) (let* ((irs (let* ((_a$3156 (var-deref "clojure.core" "mapv")) (_a$3157 (lambda (x) (let fnrec3155 ((x x)) (jolt-invoke infer x tenv env)))) (_a$3158 (jolt-get node (keyword #f "items")))) (jolt-invoke _a$3156 _a$3157 _a$3158))) (ets (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3159 ((r r)) (jolt-nth r 0))) irs)) (el (if (jolt-empty? ets) (keyword #f "any") (let* ((_a$3160 (var-deref "jolt.passes.types.lattice" "join")) (_a$3161 (jolt-first ets)) (_a$3162 (jolt-rest ets))) (jolt-reduce _a$3160 _a$3161 _a$3162))))) (let* ((_o$3164 (jolt-invoke (var-deref "jolt.passes.types.lattice" "cap") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") el) (var-deref "jolt.passes.types.lattice" "type-depth"))) (_o$3165 (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3163 ((r r)) (jolt-nth r 1))) irs)))) (jolt-vector _o$3164 _o$3165))) (if (jolt= op (keyword #f "set")) (let* ((irs (let* ((_a$3167 (var-deref "clojure.core" "mapv")) (_a$3168 (lambda (x) (let fnrec3166 ((x x)) (jolt-invoke infer x tenv env)))) (_a$3169 (jolt-get node (keyword #f "items")))) (jolt-invoke _a$3167 _a$3168 _a$3169))) (ets (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3170 ((r r)) (jolt-nth r 0))) irs)) (el (if (jolt-empty? ets) (keyword #f "any") (let* ((_a$3171 (var-deref "jolt.passes.types.lattice" "join")) (_a$3172 (jolt-first ets)) (_a$3173 (jolt-rest ets))) (jolt-reduce _a$3171 _a$3172 _a$3173))))) (let* ((_o$3175 (jolt-invoke (var-deref "jolt.passes.types.lattice" "cap") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-set") el) (var-deref "jolt.passes.types.lattice" "type-depth"))) (_o$3176 (jolt-assoc node (keyword #f "items") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3174 ((r r)) (jolt-nth r 1))) irs)))) (jolt-vector _o$3175 _o$3176))) (if (jolt= op (keyword #f "if")) (let* ((tr (jolt-invoke infer (jolt-get node (keyword #f "test")) tenv env)) (thn (jolt-invoke infer (jolt-get node (keyword #f "then")) tenv env)) (els (jolt-invoke infer (jolt-get node (keyword #f "else")) tenv env))) (let* ((_o$3187 (let* ((_a$3177 (var-deref "jolt.passes.types.lattice" "join")) (_a$3178 (jolt-nth thn 0)) (_a$3179 (jolt-nth els 0))) (jolt-invoke _a$3177 _a$3178 _a$3179))) (_o$3188 (let* ((_a$3180 node) (_a$3181 (keyword #f "test")) (_a$3182 (jolt-nth tr 1)) (_a$3183 (keyword #f "then")) (_a$3184 (jolt-nth thn 1)) (_a$3185 (keyword #f "else")) (_a$3186 (jolt-nth els 1))) (jolt-assoc _a$3180 _a$3181 _a$3182 _a$3183 _a$3184 _a$3185 _a$3186)))) (jolt-vector _o$3187 _o$3188))) (if (jolt= op (keyword #f "do")) (let* ((stmts (let* ((_a$3190 (var-deref "clojure.core" "mapv")) (_a$3191 (lambda (s) (let fnrec3189 ((s s)) (jolt-nth (jolt-invoke infer s tenv env) 1)))) (_a$3192 (jolt-get node (keyword #f "statements")))) (jolt-invoke _a$3190 _a$3191 _a$3192))) (r (jolt-invoke infer (jolt-get node (keyword #f "ret")) tenv env))) (let* ((_o$3193 (jolt-nth r 0)) (_o$3194 (jolt-assoc node (keyword #f "statements") stmts (keyword #f "ret") (jolt-nth r 1)))) (jolt-vector _o$3193 _o$3194))) (if (jolt= op (keyword #f "throw")) (let* ((_o$3195 (keyword #f "any")) (_o$3196 (jolt-assoc node (keyword #f "expr") (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "expr")) tenv env) 1)))) (jolt-vector _o$3195 _o$3196)) (if (jolt= op (keyword #f "var")) (begin (let* ((_a$3197 (var-deref "clojure.core" "swap!")) (_a$3198 (jolt-get env (keyword #f "escapes"))) (_a$3199 jolt-conj) (_a$3200 (jolt-invoke (var-deref "jolt.passes.types" "var-key") node))) (jolt-invoke _a$3197 _a$3198 _a$3199 _a$3200)) (let* ((_o$3203 (let* ((vt (let* ((_a$3201 (jolt-get env (keyword #f "vtypes"))) (_a$3202 (jolt-invoke (var-deref "jolt.passes.types" "var-key") node))) (jolt-get _a$3201 _a$3202)))) (if (jolt-truthy? vt) vt (keyword #f "any")))) (_o$3204 node)) (jolt-vector _o$3203 _o$3204))) (if (jolt= op (keyword #f "invoke")) (let* ((fnode (jolt-get node (keyword #f "fn"))) (iscall-var (jolt= (keyword #f "var") (jolt-get fnode (keyword #f "op")))) (cn (if (jolt-truthy? (let* ((and__13__auto iscall-var)) (if (jolt-truthy? and__13__auto) (jolt= "clojure.core" (jolt-get fnode (keyword #f "ns"))) and__13__auto))) (jolt-get fnode (keyword #f "name")) jolt-nil)) (args (jolt-get node (keyword #f "args"))) (n (jolt-count args))) (if (jolt-truthy? (let* ((and__13__auto iscall-var)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-contains? (var-deref "jolt.passes.types" "fold-preds") cn))) (if (jolt-truthy? and__13__auto) (jolt= n 1) and__13__auto)) and__13__auto))) (let* ((ar (jolt-invoke infer (jolt-nth args 0) tenv env)) (v (jolt-invoke (var-deref "jolt.passes.types" "pred-on") cn (jolt-nth ar 0)))) (if (jolt-truthy? (let* ((and__13__auto (jolt-not (jolt-invoke (var-deref "clojure.core" "nil?") v)))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types" "pure-node?") (jolt-nth ar 1)) and__13__auto))) (let* ((_o$3209 (keyword #f "any")) (_o$3210 (let* ((_o$3205 (keyword #f "op")) (_o$3206 (keyword #f "const")) (_o$3207 (keyword #f "val")) (_o$3208 v)) (jolt-hash-map _o$3205 _o$3206 _o$3207 _o$3208)))) (jolt-vector _o$3209 _o$3210)) (let* ((_o$3211 (jolt-invoke (var-deref "jolt.passes.types" "call-ret-type") fnode env)) (_o$3212 (jolt-assoc node (keyword #f "args") (jolt-vector (jolt-nth ar 1))))) (jolt-vector _o$3211 _o$3212)))) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.fold" "kw-callee?") fnode))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 1))) (if (jolt-truthy? and__13__auto) (<= n 2) and__13__auto)) and__13__auto))) (let* ((mr (jolt-invoke infer (jolt-nth args 0) tenv env)) (mt (jolt-nth mr 0)) (msub (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-safe?") mt)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mark-struct") (jolt-nth mr 1) mt) (jolt-nth mr 1))) (ft (jolt-invoke (var-deref "jolt.passes.types.lattice" "field-type") mt (jolt-get fnode (keyword #f "val")))) (dr (if (jolt= n 2) (jolt-invoke infer (jolt-nth args 1) tenv env) jolt-nil))) (let* ((_o$3215 (if (jolt-truthy? dr) (jolt-invoke (var-deref "jolt.passes.types.lattice" "join") ft (jolt-nth dr 0)) ft)) (_o$3216 (jolt-assoc node (keyword #f "args") (if (jolt-truthy? dr) (let* ((_o$3213 msub) (_o$3214 (jolt-nth dr 1))) (jolt-vector _o$3213 _o$3214)) (jolt-vector msub))))) (jolt-vector _o$3215 _o$3216))) (if (jolt-truthy? (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.fold" "get-callee?") fnode))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 2))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= (keyword #f "const") (jolt-get (jolt-nth args 1) (keyword #f "op"))))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "keyword?") (jolt-get (jolt-nth args 1) (keyword #f "val"))) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((mr (jolt-invoke infer (jolt-nth args 0) tenv env)) (mt (jolt-nth mr 0)) (msub (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "struct-safe?") mt)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mark-struct") (jolt-nth mr 1) mt) (jolt-nth mr 1))) (kr (jolt-invoke infer (jolt-nth args 1) tenv env)) (ft (jolt-invoke (var-deref "jolt.passes.types.lattice" "field-type") mt (jolt-get (jolt-nth args 1) (keyword #f "val")))) (dr (if (jolt= n 3) (jolt-invoke infer (jolt-nth args 2) tenv env) jolt-nil))) (let* ((_o$3222 (if (jolt-truthy? dr) (jolt-invoke (var-deref "jolt.passes.types.lattice" "join") ft (jolt-nth dr 0)) ft)) (_o$3223 (jolt-assoc node (keyword #f "args") (if (jolt-truthy? dr) (let* ((_o$3217 msub) (_o$3218 (jolt-nth kr 1)) (_o$3219 (jolt-nth dr 1))) (jolt-vector _o$3217 _o$3218 _o$3219)) (let* ((_o$3220 msub) (_o$3221 (jolt-nth kr 1))) (jolt-vector _o$3220 _o$3221)))))) (jolt-vector _o$3222 _o$3223))) (if (jolt-truthy? (let* ((and__13__auto (jolt= cn "reduce"))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 2))) (if (jolt-truthy? and__13__auto) (jolt= (keyword #f "fn") (jolt-get (jolt-nth args 0) (keyword #f "op"))) and__13__auto)) and__13__auto))) (let* ((three (>= n 3)) (coll-r (jolt-invoke infer (jolt-nth args (if (jolt-truthy? three) 2 1)) tenv env)) (init-r (if (jolt-truthy? three) (jolt-invoke infer (jolt-nth args 1) tenv env) jolt-nil)) (et (let* ((ct (jolt-nth coll-r 0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") ct)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") ct) (keyword #f "any")))) (init-t (if (jolt-truthy? init-r) (jolt-nth init-r 0) (keyword #f "any"))) (fn-r (let* ((_a$3228 (var-deref "jolt.passes.types" "infer-fn-seeded")) (_a$3229 (jolt-nth args 0)) (_a$3230 (let* ((_o$3224 0) (_o$3225 init-t) (_o$3226 1) (_o$3227 et)) (jolt-hash-map _o$3224 _o$3225 _o$3226 _o$3227))) (_a$3231 tenv) (_a$3232 env)) (jolt-invoke _a$3228 _a$3229 _a$3230 _a$3231 _a$3232)))) (let* ((_o$3238 (jolt-invoke (var-deref "jolt.passes.types.lattice" "join") init-t (jolt-nth fn-r 0))) (_o$3239 (jolt-assoc node (keyword #f "args") (if (jolt-truthy? three) (let* ((_o$3233 (jolt-nth fn-r 1)) (_o$3234 (jolt-nth init-r 1)) (_o$3235 (jolt-nth coll-r 1))) (jolt-vector _o$3233 _o$3234 _o$3235)) (let* ((_o$3236 (jolt-nth fn-r 1)) (_o$3237 (jolt-nth coll-r 1))) (jolt-vector _o$3236 _o$3237)))))) (jolt-vector _o$3238 _o$3239))) (if (jolt-truthy? (let* ((and__13__auto cn)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-get (var-deref "jolt.passes.types" "hof-table") cn))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (>= n 2))) (if (jolt-truthy? and__13__auto) (jolt= (keyword #f "fn") (jolt-get (jolt-nth args 0) (keyword #f "op"))) and__13__auto)) and__13__auto)) and__13__auto))) (let* ((coll-r (jolt-invoke infer (jolt-nth args 1) tenv env)) (et (let* ((ct (jolt-nth coll-r 0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") ct)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") ct) (keyword #f "any")))) (fn-r (let* ((_a$3242 (var-deref "jolt.passes.types" "infer-fn-seeded")) (_a$3243 (jolt-nth args 0)) (_a$3244 (let* ((_o$3240 (jolt-get (jolt-get (var-deref "jolt.passes.types" "hof-table") cn) (keyword #f "epos"))) (_o$3241 et)) (jolt-hash-map _o$3240 _o$3241))) (_a$3245 tenv) (_a$3246 env)) (jolt-invoke _a$3242 _a$3243 _a$3244 _a$3245 _a$3246))) (rt (if (jolt= cn "mapv") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (jolt-nth fn-r 0)) (if (jolt= cn "filterv") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") et) (if (jolt-truthy? (keyword #f "else")) (keyword #f "any") jolt-nil))))) (let* ((_o$3249 rt) (_o$3250 (jolt-assoc node (keyword #f "args") (let* ((_o$3247 (jolt-nth fn-r 1)) (_o$3248 (jolt-nth coll-r 1))) (jolt-vector _o$3247 _o$3248))))) (jolt-vector _o$3249 _o$3250))) (if (jolt-truthy? (let* ((and__13__auto (let* ((or__14__auto (jolt= cn "conj"))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt= cn "into"))))) (if (jolt-truthy? and__13__auto) (>= n 1) and__13__auto))) (let* ((ares (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (a) (let fnrec3251 ((a a)) (jolt-invoke infer a tenv env))) args)) (base (jolt-nth (jolt-nth ares 0) 0)) (rest-ts (let* ((_a$3253 (var-deref "clojure.core" "mapv")) (_a$3254 (lambda (r) (let fnrec3252 ((r r)) (jolt-nth r 0)))) (_a$3255 (jolt-rest ares))) (jolt-invoke _a$3253 _a$3254 _a$3255))) (rt (if (jolt-truthy? (let* ((and__13__auto (jolt= cn "conj"))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") base) and__13__auto))) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (jolt-reduce (var-deref "jolt.passes.types.lattice" "join") (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") base) rest-ts)) (if (jolt-truthy? (let* ((and__13__auto (jolt= cn "into"))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") base))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= 2 n))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") (jolt-nth rest-ts 0)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (let* ((_a$3256 (var-deref "jolt.passes.types.lattice" "join")) (_a$3257 (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") base)) (_a$3258 (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") (jolt-nth rest-ts 0)))) (jolt-invoke _a$3256 _a$3257 _a$3258))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.passes.types" "call-ret-type") fnode env) jolt-nil))))) (let* ((_o$3260 rt) (_o$3261 (jolt-assoc node (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3259 ((r r)) (jolt-nth r 1))) ares)))) (jolt-vector _o$3260 _o$3261))) (if (jolt-truthy? (keyword #f "else")) (let* ((fr (if (jolt-not iscall-var) (jolt-invoke infer fnode tenv env) jolt-nil)) (fnode_PRIME_ (if (jolt-truthy? iscall-var) fnode (jolt-nth fr 1))) (callee-t (if (jolt-truthy? iscall-var) (let* ((_a$3262 (jolt-get env (keyword #f "vtypes"))) (_a$3263 (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode))) (jolt-get _a$3262 _a$3263)) (jolt-nth fr 0))) (ares (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (a) (let fnrec3264 ((a a)) (jolt-invoke infer a tenv env))) args))) (begin (if (jolt-truthy? iscall-var) (let* ((_a$3268 (var-deref "clojure.core" "swap!")) (_a$3269 (jolt-get env (keyword #f "calls"))) (_a$3270 jolt-conj) (_a$3271 (let* ((_o$3266 (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode)) (_o$3267 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3265 ((r r)) (jolt-nth r 0))) ares))) (jolt-vector _o$3266 _o$3267)))) (jolt-invoke _a$3268 _a$3269 _a$3270 _a$3271)) jolt-nil) (if (jolt-truthy? (jolt-get env (keyword #f "checking?"))) (let* ((ats (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3272 ((r r)) (jolt-nth r 0))) ares)) (pos (jolt-get node (keyword #f "pos")))) (begin (if (jolt-truthy? cn) (jolt-invoke (var-deref "jolt.passes.types" "check-invoke") cn args ats pos env) jolt-nil) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types" "not-callable?") callee-t)) (let* ((_a$3281 (var-deref "clojure.core" "swap!")) (_a$3282 (jolt-get env (keyword #f "diags"))) (_a$3283 jolt-conj) (_a$3284 (let* ((_o$3273 (keyword #f "op")) (_o$3274 (keyword #f "call")) (_o$3275 (keyword #f "type")) (_o$3276 (jolt-invoke (var-deref "jolt.passes.types" "type-name") callee-t)) (_o$3277 (keyword #f "pos")) (_o$3278 pos) (_o$3279 (keyword #f "msg")) (_o$3280 (jolt-invoke (var-deref "clojure.core" "str") "cannot call " (jolt-invoke (var-deref "jolt.passes.types" "type-name") callee-t) " as a function"))) (jolt-hash-map _o$3273 _o$3274 _o$3275 _o$3276 _o$3277 _o$3278 _o$3279 _o$3280)))) (jolt-invoke _a$3281 _a$3282 _a$3283 _a$3284)) jolt-nil) (if (jolt-truthy? (let* ((and__13__auto (jolt-get env (keyword #f "strict?")))) (if (jolt-truthy? and__13__auto) iscall-var and__13__auto))) (let* ((k (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode)) (usig (jolt-get (jolt-invoke (var-deref "clojure.core" "deref") (jolt-get env (keyword #f "user-sigs"))) k))) (if (jolt-truthy? usig) (jolt-invoke (var-deref "jolt.passes.types" "check-user-call") k usig ats pos env) jolt-nil)) jolt-nil))) jolt-nil) (let* ((pm (let* ((and__13__auto iscall-var)) (if (jolt-truthy? and__13__auto) (let* ((_a$3285 (jolt-get env (keyword #f "protocol-methods"))) (_a$3286 (jolt-invoke (var-deref "jolt.passes.types" "var-key") fnode))) (jolt-get _a$3285 _a$3286)) and__13__auto))) (rtype (if (jolt-truthy? (let* ((and__13__auto pm)) (if (jolt-truthy? and__13__auto) (jolt-pos? n) and__13__auto))) (jolt-get (jolt-nth (jolt-nth ares 0) 0) (keyword #f "type")) jolt-nil)) (base (jolt-assoc node (keyword #f "fn") fnode_PRIME_ (keyword #f "args") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (r) (let fnrec3287 ((r r)) (jolt-nth r 1))) ares)))) (let* ((_o$3295 (if (jolt= cn "range") (jolt-invoke (var-deref "jolt.passes.types.lattice" "mk-vec") (keyword #f "num")) (if (jolt-truthy? (let* ((and__13__auto cn)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-contains? (var-deref "jolt.passes.types" "elem-fns") cn))) (if (jolt-truthy? and__13__auto) (> n 0) and__13__auto)) and__13__auto))) (let* ((a0 (jolt-nth (jolt-nth ares 0) 0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.passes.types.lattice" "vec-type?") a0)) (jolt-invoke (var-deref "jolt.passes.types.lattice" "velem") a0) (keyword #f "any"))) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.passes.types" "call-ret-type") fnode env) jolt-nil)))) (_o$3296 (if (jolt-truthy? rtype) (let* ((_a$3288 base) (_a$3289 (keyword #f "devirt-type")) (_a$3290 rtype) (_a$3291 (keyword #f "devirt-proto")) (_a$3292 (jolt-nth pm 0)) (_a$3293 (keyword #f "devirt-method")) (_a$3294 (jolt-nth pm 1))) (jolt-assoc _a$3288 _a$3289 _a$3290 _a$3291 _a$3292 _a$3293 _a$3294)) base))) (jolt-vector _o$3295 _o$3296))))) jolt-nil)))))))) (if (jolt= op (keyword #f "let")) (let* ((res (let* ((_a$3307 (lambda (acc b) (let fnrec3297 ((acc acc) (b b)) (let* ((te (jolt-nth acc 0)) (binds (jolt-nth acc 1)) (ir (jolt-invoke infer (jolt-nth b 1) te env))) (let* ((_o$3303 (let* ((_a$3298 te) (_a$3299 (jolt-nth b 0)) (_a$3300 (jolt-nth ir 0))) (jolt-assoc _a$3298 _a$3299 _a$3300))) (_o$3304 (jolt-conj binds (let* ((_o$3301 (jolt-nth b 0)) (_o$3302 (jolt-nth ir 1))) (jolt-vector _o$3301 _o$3302))))) (jolt-vector _o$3303 _o$3304)))))) (_a$3308 (let* ((_o$3305 tenv) (_o$3306 (jolt-vector))) (jolt-vector _o$3305 _o$3306))) (_a$3309 (jolt-get node (keyword #f "bindings")))) (jolt-reduce _a$3307 _a$3308 _a$3309))) (br (let* ((_a$3310 infer) (_a$3311 (jolt-get node (keyword #f "body"))) (_a$3312 (jolt-nth res 0)) (_a$3313 env)) (jolt-invoke _a$3310 _a$3311 _a$3312 _a$3313)))) (let* ((_o$3319 (jolt-nth br 0)) (_o$3320 (let* ((_a$3314 node) (_a$3315 (keyword #f "bindings")) (_a$3316 (jolt-nth res 1)) (_a$3317 (keyword #f "body")) (_a$3318 (jolt-nth br 1))) (jolt-assoc _a$3314 _a$3315 _a$3316 _a$3317 _a$3318)))) (jolt-vector _o$3319 _o$3320))) (if (jolt= op (keyword #f "loop")) (let* ((_o$3332 (keyword #f "any")) (_o$3333 (let* ((_a$3327 node) (_a$3328 (keyword #f "bindings")) (_a$3329 (let* ((_a$3324 (var-deref "clojure.core" "mapv")) (_a$3325 (lambda (b) (let fnrec3321 ((b b)) (let* ((_o$3322 (jolt-nth b 0)) (_o$3323 (jolt-nth (jolt-invoke infer (jolt-nth b 1) tenv env) 1))) (jolt-vector _o$3322 _o$3323))))) (_a$3326 (jolt-get node (keyword #f "bindings")))) (jolt-invoke _a$3324 _a$3325 _a$3326))) (_a$3330 (keyword #f "body")) (_a$3331 (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "body")) tenv env) 1))) (jolt-assoc _a$3327 _a$3328 _a$3329 _a$3330 _a$3331)))) (jolt-vector _o$3332 _o$3333)) (if (jolt= op (keyword #f "recur")) (let* ((_o$3338 (keyword #f "any")) (_o$3339 (jolt-assoc node (keyword #f "args") (let* ((_a$3335 (var-deref "clojure.core" "mapv")) (_a$3336 (lambda (a) (let fnrec3334 ((a a)) (jolt-nth (jolt-invoke infer a tenv env) 1)))) (_a$3337 (jolt-get node (keyword #f "args")))) (jolt-invoke _a$3335 _a$3336 _a$3337))))) (jolt-vector _o$3338 _o$3339)) (if (jolt= op (keyword #f "fn")) (let* ((_o$3355 (keyword #f "any")) (_o$3356 (jolt-assoc node (keyword #f "arities") (let* ((_a$3352 (var-deref "clojure.core" "mapv")) (_a$3353 (lambda (a) (let fnrec3340 ((a a)) (let* ((shapes (jolt-get env (keyword #f "record-shapes"))) (phm (let* ((_a$3345 (lambda (m pr) (let fnrec3341 ((m m) (pr pr)) (let* ((_a$3342 m) (_a$3343 (jolt-nth pr 0)) (_a$3344 (jolt-nth pr 1))) (jolt-assoc _a$3342 _a$3343 _a$3344))))) (_a$3346 (jolt-hash-map)) (_a$3347 (jolt-get a (keyword #f "phints")))) (jolt-reduce _a$3345 _a$3346 _a$3347))) (pe (let* ((_a$3349 (lambda (e p) (let fnrec3348 ((e e) (p p)) (jolt-assoc e p (let* ((ent (jolt-get shapes (jolt-get phm p)))) (if (jolt-truthy? ent) (jolt-invoke (var-deref "jolt.passes.types" "record-type-from-entry") ent (var-deref "jolt.passes.types.lattice" "type-depth") shapes) (keyword #f "any"))))))) (_a$3350 tenv) (_a$3351 (jolt-get a (keyword #f "params")))) (jolt-reduce _a$3349 _a$3350 _a$3351))) (pe (if (jolt-truthy? (jolt-get a (keyword #f "rest"))) (jolt-assoc pe (jolt-get a (keyword #f "rest")) (keyword #f "any")) pe))) (jolt-assoc a (keyword #f "body") (jolt-nth (jolt-invoke infer (jolt-get a (keyword #f "body")) pe env) 1)))))) (_a$3354 (jolt-get node (keyword #f "arities")))) (jolt-invoke _a$3352 _a$3353 _a$3354))))) (jolt-vector _o$3355 _o$3356)) (if (jolt= op (keyword #f "def")) (begin (if (jolt-truthy? (jolt-get env (keyword #f "checking?"))) (jolt-invoke (var-deref "jolt.passes.types" "register-user-fn!") node env) jolt-nil) (let* ((_o$3357 (keyword #f "any")) (_o$3358 (jolt-assoc node (keyword #f "init") (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "init")) tenv env) 1)))) (jolt-vector _o$3357 _o$3358))) (if (jolt= op (keyword #f "try")) (let* ((_o$3366 (keyword #f "any")) (_o$3367 (let* ((_a$3359 node) (_a$3360 (keyword #f "body")) (_a$3361 (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "body")) tenv env) 1)) (_a$3362 (keyword #f "catch-body")) (_a$3363 (if (jolt-truthy? (jolt-get node (keyword #f "catch-body"))) (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "catch-body")) tenv env) 1) jolt-nil)) (_a$3364 (keyword #f "finally")) (_a$3365 (if (jolt-truthy? (jolt-get node (keyword #f "finally"))) (jolt-nth (jolt-invoke infer (jolt-get node (keyword #f "finally")) tenv env) 1) jolt-nil))) (jolt-assoc _a$3359 _a$3360 _a$3361 _a$3362 _a$3363 _a$3364 _a$3365)))) (jolt-vector _o$3366 _o$3367)) (if (jolt-truthy? (keyword #f "else")) (let* ((_o$3368 (keyword #f "any")) (_o$3369 node)) (jolt-vector _o$3368 _o$3369)) jolt-nil)))))))))))))))))))))) infer))) (guard (e (#t #f)) (def-var! "jolt.passes.types" "infer-top" (letrec ((infer-top (lambda (node env) (let fnrec3370 ((node node) (env env)) (jolt-nth (jolt-invoke (var-deref "jolt.passes.types" "infer") node (jolt-hash-map) env) 1))))) infer-top))) (guard (e (#t #f)) diff --git a/jolt-core/jolt/passes/fold.clj b/jolt-core/jolt/passes/fold.clj index 7ae9523..c13d38e 100644 --- a/jolt-core/jolt/passes/fold.clj +++ b/jolt-core/jolt/passes/fold.clj @@ -73,3 +73,19 @@ (defn scalar-const? [n] (and (= :const (get n :op)) (let [v (get n :val)] (or (keyword? v) (string? v) (number? v) (boolean? v))))) + +;; The two callee shapes a constant-keyword map lookup takes: a keyword in fn +;; position — (:k m) — or clojure.core/get with a const key — (get m :k). The +;; inliner (scalar replacement) and the type inferencer both recognize these; +;; sharing the head predicates keeps the two from drifting. Each caller still +;; imposes its own arity, subject, and key-type constraints. +(defn kw-callee? + "True if fnode is a constant keyword used as a function head — the (:k m) form." + [fnode] + (and (= :const (get fnode :op)) (keyword? (get fnode :val)))) + +(defn get-callee? + "True if fnode is the clojure.core/get (or host get) callee — the (get m k) form." + [fnode] + (or (and (= :var (get fnode :op)) (= "clojure.core" (get fnode :ns)) (= "get" (get fnode :name))) + (and (= :host (get fnode :op)) (= "get" (get fnode :name))))) diff --git a/jolt-core/jolt/passes/inline.clj b/jolt-core/jolt/passes/inline.clj index 354f36e..08f5bc8 100644 --- a/jolt-core/jolt/passes/inline.clj +++ b/jolt-core/jolt/passes/inline.clj @@ -5,7 +5,7 @@ and the `dirty` fixpoint flag. Portable Clojure (compiler-tier)." (:require [jolt.host :refer [inline-ir]] [jolt.ir :refer [map-ir-children reduce-ir-children coerce-node]] - [jolt.passes.fold :refer [scalar-const?]])) + [jolt.passes.fold :refer [scalar-const? kw-callee? get-callee?]])) ;; --------------------------------------------------------------------------- ;; Shared state: a dirty flag the fixpoint loop reads, and a fresh-name counter @@ -229,7 +229,7 @@ (defn- pure-fn? [f] (let [op (get f :op)] (cond - (and (= op :const) (keyword? (get f :val))) true + (kw-callee? f) true (= op :var) (and (= "clojure.core" (get f :ns)) (contains? pure-fns (get f :name))) (= op :host) (contains? pure-fns (get f :name)) :else false))) @@ -282,13 +282,12 @@ (if (= :invoke (get node :op)) (let [f (get node :fn) args (get node :args)] (cond - (and (= :const (get f :op)) (keyword? (get f :val)) + (and (kw-callee? f) (= 1 (count args)) (= :local (get (nth args 0) :op)) (= nm (get (nth args 0) :name))) (get f :val) - (and (or (and (= :var (get f :op)) (= "clojure.core" (get f :ns)) (= "get" (get f :name))) - (and (= :host (get f :op)) (= "get" (get f :name)))) + (and (get-callee? f) (= 2 (count args)) (= :local (get (nth args 0) :op)) (= nm (get (nth args 0) :name)) (scalar-const? (nth args 1))) @@ -500,7 +499,7 @@ lookup folds only for a declared field." [node] (let [f (get node :fn) args (get node :args)] - (if (and (= :const (get f :op)) (keyword? (get f :val)) (= 1 (count args))) + (if (and (kw-callee? f) (= 1 (count args))) (let [m (nth args 0) k (get f :val)] (if (and (= :map (get m :op)) (const-key-map? m) (all-vals-pure? m)) (do (mark!) (map-val m k)) diff --git a/jolt-core/jolt/passes/types.clj b/jolt-core/jolt/passes/types.clj index b29b06e..91a7281 100644 --- a/jolt-core/jolt/passes/types.clj +++ b/jolt-core/jolt/passes/types.clj @@ -4,8 +4,8 @@ top = :any) that types expressions and reuses the same walk as a loose success checker. Also the inter-procedural driver API the back end calls to propagate param types across a unit / the whole program. Weakly coupled to the - IR-rewriting passes — shares only the const-shape predicate (jolt.passes.fold)." - (:require [jolt.passes.fold :refer [scalar-const?]] + IR-rewriting passes — shares the const-shape predicates (jolt.passes.fold)." + (:require [jolt.passes.fold :refer [scalar-const? kw-callee? get-callee?]] [jolt.passes.types.lattice :refer [velem selem sfields vec-type? set-type? struct-type? mk-vec mk-set mk-struct union-cap scalar-t? union-type? umembers union-of merge-fields @@ -263,7 +263,7 @@ ;; (:k m) / (:k m default): the result is m's field type, and if m is a ;; struct the subject is tagged so the back end drops the guard — this ;; types nested access end to end (RFC 0005). - (and (= :const (get fnode :op)) (keyword? (get fnode :val)) (>= n 1) (<= n 2)) + (and (kw-callee? fnode) (>= n 1) (<= n 2)) (let [mr (infer (nth args 0) tenv env) mt (nth mr 0) msub (if (struct-safe? mt) (mark-struct (nth mr 1) mt) (nth mr 1)) @@ -272,8 +272,7 @@ [(if dr (join ft (nth dr 0)) ft) (assoc node :args (if dr [msub (nth dr 1)] [msub]))]) ;; (get m :k [default]): same, when the key is a constant keyword. - (and (or (and (= :var (get fnode :op)) (= "clojure.core" (get fnode :ns)) (= "get" (get fnode :name))) - (and (= :host (get fnode :op)) (= "get" (get fnode :name)))) + (and (get-callee? fnode) (>= n 2) (= :const (get (nth args 1) :op)) (keyword? (get (nth args 1) :val))) (let [mr (infer (nth args 0) tenv env) mt (nth mr 0)