diff --git a/host/chez/reader.ss b/host/chez/reader.ss index 91decb4..46a06b6 100644 --- a/host/chez/reader.ss +++ b/host/chez/reader.ss @@ -36,9 +36,13 @@ (define (rdr-ws? c) (or (char-whitespace? c) (char=? c #\,))) +;; `'` (apostrophe) is a NON-terminating macro char in Clojure (isTerminatingMacro +;; is false for it), so it's a valid symbol constituent after the first char: +;; inc'/+'/foo' read as single symbols. A LEADING ' still dispatches as quote +;; (handled before token reading begins). Omit it from the terminator set. (define (rdr-terminator? c) (or (rdr-ws? c) - (memv c '(#\( #\) #\[ #\] #\{ #\} #\" #\; #\@ #\^ #\' #\` #\~ #\\)))) + (memv c '(#\( #\) #\[ #\] #\{ #\} #\" #\; #\@ #\^ #\` #\~ #\\)))) (define (rdr-digit? c) (and (char>=? c #\0) (char<=? c #\9))) @@ -283,8 +287,11 @@ ;; non-symbol target (a collection): lower to a runtime (with-meta form meta) ;; the analyzer compiles like any invoke — same as the Janet reader, so e.g. ;; (meta ^{:tag :int} [1 2]) and ^:foo {} carry their meta at runtime. The meta - ;; pmap doubles as its own map-literal form. - (jolt-list (jolt-symbol "clojure.core" "with-meta") target meta))) + ;; pmap doubles as its own map-literal form. Use the BARE `with-meta` symbol + ;; (ns #f) to match the Janet reader exactly — the fn/defn macros unwrap a + ;; (with-meta _) return-hint by matching the unqualified head, + ;; so a qualified clojure.core/with-meta would slip past them (^bytes [b]). + (jolt-list (jolt-symbol #f "with-meta") target meta))) ;; --- # dispatch ------------------------------------------------------------- ;; #(...) anonymous fn shorthand (jolt-qjr0): % -> p1, %N -> pN, %& -> rest. The diff --git a/host/chez/seed/image.ss b/host/chez/seed/image.ss index 629a3de..fc41a23 100644 --- a/host/chez/seed/image.ss +++ b/host/chez/seed/image.ss @@ -73,33 +73,35 @@ (guard (e (#t #f)) (def-var! "jolt.analyzer" "analyze-arity" (letrec ((analyze-arity (lambda (ctx pvec body env fn-name) (let fnrec1558 ((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-get pp (keyword #f "fixed"))) (rst (jolt-get pp (keyword #f "rest"))) (rname (jolt-invoke (var-deref "jolt.analyzer" "gen-name") (jolt-invoke (var-deref "clojure.core" "str") (jolt-invoke (var-deref "jolt.host" "compile-ns") ctx) "/" (let* ((or__14__auto fn-name)) (if (jolt-truthy? or__14__auto) or__14__auto "fn")) "--"))) (names (let* ((G__35 (jolt-invoke (var-deref "clojure.core" "vec") fixed))) (let* ((G__36 (if (jolt-truthy? rst) (jolt-conj G__35 rst) G__35))) (let* ((G__37 (if (jolt-truthy? fn-name) (jolt-conj G__36 fn-name) G__36))) G__37)))) (env0 (jolt-invoke (var-deref "jolt.analyzer" "with-recur") (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env names) rname)) (env* (jolt-reduce (lambda (e pr) (let fnrec1559 ((e e) (pr pr)) (jolt-invoke (var-deref "jolt.analyzer" "add-hint") e (jolt-nth pr 0.0) (jolt-nth pr 1.0)))) env0 (jolt-get pp (keyword #f "hints")))) (arity (let* ((_o$1560 (keyword #f "params")) (_o$1561 fixed) (_o$1562 (keyword #f "recur-name")) (_o$1563 rname) (_o$1564 (keyword #f "body")) (_o$1565 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx body env*))) (jolt-hash-map _o$1560 _o$1561 _o$1562 _o$1563 _o$1564 _o$1565))) (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))) (if (jolt-truthy? rst) (jolt-assoc arity (keyword #f "rest") rst) arity)))))) analyze-arity))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-fn" (letrec ((analyze-fn (lambda (ctx items env) (let fnrec1566 ((ctx ctx) (items items) (env env)) (let* ((named (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1.0))) (fn-name (if (jolt-truthy? named) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1.0)) jolt-nil)) (rest-items (if (jolt-truthy? named) (jolt-drop 2.0 items) (jolt-drop 1.0 items))) (first* (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 fnrec1567 ((clause clause)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") clause)))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-arity") ctx (jolt-first cl) (jolt-rest cl) env fn-name)))) 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" "strip-arglist-meta" (letrec ((strip-arglist-meta (lambda (form) (let fnrec1566 ((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.0 (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.0)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-nth es 1.0) form)) form))))) strip-arglist-meta))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-try" (letrec ((analyze-try (lambda (ctx items env) (let fnrec1568 ((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 fnrec1573 ((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.0))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth cl 2.0)))))) (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.0))) (jolt-invoke (var-deref "clojure.core" "reset!") catch-body (jolt-drop 3.0 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$1569 (keyword #f "op")) (_o$1570 (keyword #f "try")) (_o$1571 (keyword #f "body")) (_o$1572 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") body) env))) (jolt-hash-map _o$1569 _o$1570 _o$1571 _o$1572))) (n (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "deref") catch-body)) (jolt-assoc n (keyword #f "catch-sym") (jolt-invoke (var-deref "clojure.core" "deref") catch-sym) (keyword #f "catch-body") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") catch-body) (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector (jolt-invoke (var-deref "clojure.core" "deref") catch-sym))))) 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-fn" (letrec ((analyze-fn (lambda (ctx items env) (let fnrec1567 ((ctx ctx) (items items) (env env)) (let* ((named (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1.0))) (fn-name (if (jolt-truthy? named) (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1.0)) jolt-nil)) (rest-items (if (jolt-truthy? named) (jolt-drop 2.0 items) (jolt-drop 1.0 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 fnrec1568 ((clause clause)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") clause)))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-arity") ctx (jolt-invoke (var-deref "jolt.analyzer" "strip-arglist-meta") (jolt-first cl)) (jolt-rest cl) env fn-name)))) 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-letfn" (letrec ((analyze-letfn (lambda (ctx items env) (let fnrec1574 ((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.0)))) (names (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__49_) (let fnrec1583 ((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 fnrec1584 ((spec spec)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") spec)))) (let* ((_o$1585 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first cl))) (_o$1586 (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx (jolt-invoke (var-deref "clojure.core" "vec") (jolt-cons (jolt-first cl) cl)) env*))) (jolt-vector _o$1585 _o$1586))))) specs))) (let* ((_o$1575 (keyword #f "op")) (_o$1576 (keyword #f "let")) (_o$1577 (keyword #f "letrec")) (_o$1578 #t) (_o$1579 (keyword #f "bindings")) (_o$1580 binds) (_o$1581 (keyword #f "body")) (_o$1582 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2.0 items) env*))) (jolt-hash-map _o$1575 _o$1576 _o$1577 _o$1578 _o$1579 _o$1580 _o$1581 _o$1582))))))) analyze-letfn))) + (def-var! "jolt.analyzer" "analyze-try" (letrec ((analyze-try (lambda (ctx items env) (let fnrec1569 ((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 fnrec1574 ((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.0))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt-not (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth cl 2.0)))))) (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.0))) (jolt-invoke (var-deref "clojure.core" "reset!") catch-body (jolt-drop 3.0 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$1570 (keyword #f "op")) (_o$1571 (keyword #f "try")) (_o$1572 (keyword #f "body")) (_o$1573 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") body) env))) (jolt-hash-map _o$1570 _o$1571 _o$1572 _o$1573))) (n (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "deref") catch-body)) (jolt-assoc n (keyword #f "catch-sym") (jolt-invoke (var-deref "clojure.core" "deref") catch-sym) (keyword #f "catch-body") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-invoke (var-deref "clojure.core" "deref") catch-body) (jolt-invoke (var-deref "jolt.analyzer" "add-locals") env (jolt-vector (jolt-invoke (var-deref "clojure.core" "deref") catch-sym))))) 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-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec1587 ((ctx ctx) (op op) (items items) (env env)) (let* ((G__38 op)) (if (jolt= G__38 "quote") (jolt-invoke (var-deref "jolt.ir" "quote-node") (jolt-invoke (var-deref "clojure.core" "second") items)) (if (jolt= G__38 "if") (begin (if (jolt-truthy? (let* ((or__14__auto (< (jolt-count items) 3.0))) (if (jolt-truthy? or__14__auto) or__14__auto (> (jolt-count items) 4.0)))) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Wrong number of args (" (jolt-dec (jolt-count items)) ") passed to: if")) jolt-nil) (jolt-invoke (var-deref "jolt.ir" "if-node") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2.0) env) (if (> (jolt-count items) 3.0) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 3.0) env) (jolt-invoke (var-deref "jolt.ir" "const") jolt-nil)))) (if (jolt= G__38 "do") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-rest items) env) (if (jolt= G__38 "throw") (jolt-invoke (var-deref "jolt.ir" "throw-node") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (if (jolt= G__38 "def") (let* ((name-sym (jolt-nth items 1.0))) (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.0) (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$1603 (keyword #f "op")) (_o$1604 (keyword #f "def")) (_o$1605 (keyword #f "ns")) (_o$1606 cur) (_o$1607 (keyword #f "name")) (_o$1608 nm) (_o$1609 (keyword #f "no-init")) (_o$1610 #t)) (jolt-hash-map _o$1603 _o$1604 _o$1605 _o$1606 _o$1607 _o$1608 _o$1609 _o$1610)))) (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.0))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "string?") (jolt-nth items 2.0)) and__13__auto))) (val-form (jolt-nth items (if (jolt-truthy? has-doc) 3.0 2.0))) (base-meta (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)))) (node-meta (if (jolt-truthy? has-doc) (jolt-assoc base-meta (keyword #f "doc") (jolt-nth items 2.0)) base-meta))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (jolt-invoke (var-deref "jolt.ir" "def-node") cur nm (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env) node-meta)))))) (if (jolt= G__38 "let*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1.0)))) (r (jolt-invoke (var-deref "jolt.analyzer" "analyze-bindings") ctx bvec env))) (jolt-invoke (var-deref "jolt.ir" "let-node") (jolt-first r) (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2.0 items) (jolt-invoke (var-deref "clojure.core" "second") r)))) (if (jolt= G__38 "loop*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1.0)))) (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$1595 (keyword #f "op")) (_o$1596 (keyword #f "loop")) (_o$1597 (keyword #f "recur-name")) (_o$1598 rname) (_o$1599 (keyword #f "bindings")) (_o$1600 (jolt-first r)) (_o$1601 (keyword #f "body")) (_o$1602 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2.0 items) env**))) (jolt-hash-map _o$1595 _o$1596 _o$1597 _o$1598 _o$1599 _o$1600 _o$1601 _o$1602))) (if (jolt= G__38 "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$1589 (keyword #f "op")) (_o$1590 (keyword #f "recur")) (_o$1591 (keyword #f "recur-name")) (_o$1592 rt) (_o$1593 (keyword #f "args")) (_o$1594 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__50_) (let fnrec1588 ((p__50_ p__50_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__50_ env))) (jolt-rest items)))) (jolt-hash-map _o$1589 _o$1590 _o$1591 _o$1592 _o$1593 _o$1594)))) (if (jolt= G__38 "try") (jolt-invoke (var-deref "jolt.analyzer" "analyze-try") ctx items env) (if (jolt= G__38 "letfn") (jolt-invoke (var-deref "jolt.analyzer" "analyze-letfn") ctx items env) (if (jolt= G__38 "fn*") (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx items env) (if (jolt= G__38 "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__38 "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"))) (jolt-invoke (var-deref "jolt.ir" "the-var") (jolt-get r (keyword #f "ns")) (jolt-get r (keyword #f "name"))) (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))))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "special form " op)))))))))))))))))))) analyze-special))) + (def-var! "jolt.analyzer" "analyze-letfn" (letrec ((analyze-letfn (lambda (ctx items env) (let fnrec1575 ((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.0)))) (names (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__49_) (let fnrec1584 ((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 fnrec1585 ((spec spec)) (let* ((cl (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-elements") spec)))) (let* ((_o$1586 (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-first cl))) (_o$1587 (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx (jolt-invoke (var-deref "clojure.core" "vec") (jolt-cons (jolt-first cl) cl)) env*))) (jolt-vector _o$1586 _o$1587))))) specs))) (let* ((_o$1576 (keyword #f "op")) (_o$1577 (keyword #f "let")) (_o$1578 (keyword #f "letrec")) (_o$1579 #t) (_o$1580 (keyword #f "bindings")) (_o$1581 binds) (_o$1582 (keyword #f "body")) (_o$1583 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2.0 items) env*))) (jolt-hash-map _o$1576 _o$1577 _o$1578 _o$1579 _o$1580 _o$1581 _o$1582 _o$1583))))))) analyze-letfn))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec1611 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1.0))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0.0 1.0)))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "-" (jolt-invoke (var-deref "clojure.core" "subs") nm 1.0 2.0))) and__13__auto)) and__13__auto)))))) method-head?))) + (def-var! "jolt.analyzer" "analyze-special" (letrec ((analyze-special (lambda (ctx op items env) (let fnrec1588 ((ctx ctx) (op op) (items items) (env env)) (let* ((G__38 op)) (if (jolt= G__38 "quote") (jolt-invoke (var-deref "jolt.ir" "quote-node") (jolt-invoke (var-deref "clojure.core" "second") items)) (if (jolt= G__38 "if") (begin (if (jolt-truthy? (let* ((or__14__auto (< (jolt-count items) 3.0))) (if (jolt-truthy? or__14__auto) or__14__auto (> (jolt-count items) 4.0)))) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Wrong number of args (" (jolt-dec (jolt-count items)) ") passed to: if")) jolt-nil) (jolt-invoke (var-deref "jolt.ir" "if-node") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 2.0) env) (if (> (jolt-count items) 3.0) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 3.0) env) (jolt-invoke (var-deref "jolt.ir" "const") jolt-nil)))) (if (jolt= G__38 "do") (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-rest items) env) (if (jolt= G__38 "throw") (jolt-invoke (var-deref "jolt.ir" "throw-node") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (if (jolt= G__38 "def") (let* ((name-sym (jolt-nth items 1.0))) (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.0) (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$1604 (keyword #f "op")) (_o$1605 (keyword #f "def")) (_o$1606 (keyword #f "ns")) (_o$1607 cur) (_o$1608 (keyword #f "name")) (_o$1609 nm) (_o$1610 (keyword #f "no-init")) (_o$1611 #t)) (jolt-hash-map _o$1604 _o$1605 _o$1606 _o$1607 _o$1608 _o$1609 _o$1610 _o$1611)))) (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.0))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "clojure.core" "string?") (jolt-nth items 2.0)) and__13__auto))) (val-form (jolt-nth items (if (jolt-truthy? has-doc) 3.0 2.0))) (base-meta (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)))) (node-meta (if (jolt-truthy? has-doc) (jolt-assoc base-meta (keyword #f "doc") (jolt-nth items 2.0)) base-meta))) (begin (jolt-invoke (var-deref "jolt.host" "host-intern!") ctx cur nm) (jolt-invoke (var-deref "jolt.ir" "def-node") cur nm (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx val-form env) node-meta)))))) (if (jolt= G__38 "let*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1.0)))) (r (jolt-invoke (var-deref "jolt.analyzer" "analyze-bindings") ctx bvec env))) (jolt-invoke (var-deref "jolt.ir" "let-node") (jolt-first r) (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2.0 items) (jolt-invoke (var-deref "clojure.core" "second") r)))) (if (jolt= G__38 "loop*") (let* ((bvec (jolt-invoke (var-deref "clojure.core" "vec") (jolt-invoke (var-deref "jolt.host" "form-vec-items") (jolt-nth items 1.0)))) (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$1596 (keyword #f "op")) (_o$1597 (keyword #f "loop")) (_o$1598 (keyword #f "recur-name")) (_o$1599 rname) (_o$1600 (keyword #f "bindings")) (_o$1601 (jolt-first r)) (_o$1602 (keyword #f "body")) (_o$1603 (jolt-invoke (var-deref "jolt.analyzer" "analyze-seq") ctx (jolt-drop 2.0 items) env**))) (jolt-hash-map _o$1596 _o$1597 _o$1598 _o$1599 _o$1600 _o$1601 _o$1602 _o$1603))) (if (jolt= G__38 "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$1590 (keyword #f "op")) (_o$1591 (keyword #f "recur")) (_o$1592 (keyword #f "recur-name")) (_o$1593 rt) (_o$1594 (keyword #f "args")) (_o$1595 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__50_) (let fnrec1589 ((p__50_ p__50_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__50_ env))) (jolt-rest items)))) (jolt-hash-map _o$1590 _o$1591 _o$1592 _o$1593 _o$1594 _o$1595)))) (if (jolt= G__38 "try") (jolt-invoke (var-deref "jolt.analyzer" "analyze-try") ctx items env) (if (jolt= G__38 "letfn") (jolt-invoke (var-deref "jolt.analyzer" "analyze-letfn") ctx items env) (if (jolt= G__38 "fn*") (jolt-invoke (var-deref "jolt.analyzer" "analyze-fn") ctx items env) (if (jolt= G__38 "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__38 "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"))) (jolt-invoke (var-deref "jolt.ir" "the-var") (jolt-get r (keyword #f "ns")) (jolt-get r (keyword #f "name"))) (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))))) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") (jolt-invoke (var-deref "clojure.core" "str") "special form " op)))))))))))))))))))) analyze-special))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec1612 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2.0) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed member expression, expecting (.method target ...): " hname)) jolt-nil) (let* ((_o$1614 (keyword #f "op")) (_o$1615 (keyword #f "host-call")) (_o$1616 (keyword #f "method")) (_o$1617 (jolt-invoke (var-deref "clojure.core" "subs") hname 1.0)) (_o$1618 (keyword #f "target")) (_o$1619 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (_o$1620 (keyword #f "args")) (_o$1621 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__51_) (let fnrec1613 ((p__51_ p__51_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__51_ env))) (jolt-drop 2.0 items)))) (jolt-hash-map _o$1614 _o$1615 _o$1616 _o$1617 _o$1618 _o$1619 _o$1620 _o$1621))))))) analyze-host-call))) + (def-var! "jolt.analyzer" "method-head?" (letrec ((method-head? (lambda (nm) (let fnrec1612 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1.0))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0.0 1.0)))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "-" (jolt-invoke (var-deref "clojure.core" "subs") nm 1.0 2.0))) and__13__auto)) and__13__auto)))))) method-head?))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec1622 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1.0))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm (jolt-dec (jolt-count nm)) (jolt-count nm))))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0.0 1.0))) and__13__auto)) and__13__auto)))))) ctor-head?))) + (def-var! "jolt.analyzer" "analyze-host-call" (letrec ((analyze-host-call (lambda (ctx hname items env) (let fnrec1613 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2.0) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed member expression, expecting (.method target ...): " hname)) jolt-nil) (let* ((_o$1615 (keyword #f "op")) (_o$1616 (keyword #f "host-call")) (_o$1617 (keyword #f "method")) (_o$1618 (jolt-invoke (var-deref "clojure.core" "subs") hname 1.0)) (_o$1619 (keyword #f "target")) (_o$1620 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (_o$1621 (keyword #f "args")) (_o$1622 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__51_) (let fnrec1614 ((p__51_ p__51_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__51_ env))) (jolt-drop 2.0 items)))) (jolt-hash-map _o$1615 _o$1616 _o$1617 _o$1618 _o$1619 _o$1620 _o$1621 _o$1622))))))) analyze-host-call))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec1623 ((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 fnrec1624 ((p__52_ p__52_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__52_ env))) args)))))) analyze-ctor))) + (def-var! "jolt.analyzer" "ctor-head?" (letrec ((ctor-head? (lambda (nm) (let fnrec1623 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 1.0))) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm (jolt-dec (jolt-count nm)) (jolt-count nm))))) (if (jolt-truthy? and__13__auto) (jolt-not (jolt= "." (jolt-invoke (var-deref "clojure.core" "subs") nm 0.0 1.0))) and__13__auto)) and__13__auto)))))) ctor-head?))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec1625 ((ctx ctx) (items items) (env env)) (begin (if (< (jolt-count items) 3.0) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (. target member ...) form")) jolt-nil) (let* ((member (jolt-nth items 2.0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") member)) (let* ((_o$1627 (keyword #f "op")) (_o$1628 (keyword #f "host-call")) (_o$1629 (keyword #f "method")) (_o$1630 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$1631 (keyword #f "target")) (_o$1632 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (_o$1633 (keyword #f "args")) (_o$1634 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__53_) (let fnrec1626 ((p__53_ p__53_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__53_ env))) (jolt-drop 3.0 items)))) (jolt-hash-map _o$1627 _o$1628 _o$1629 _o$1630 _o$1631 _o$1632 _o$1633 _o$1634)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "special form . (non-symbol member)")))))))) analyze-dot))) + (def-var! "jolt.analyzer" "analyze-ctor" (letrec ((analyze-ctor (lambda (ctx class args env) (let fnrec1624 ((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 fnrec1625 ((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" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec1635 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 2.0))) (if (jolt-truthy? and__13__auto) (jolt= ".-" (jolt-invoke (var-deref "clojure.core" "subs") nm 0.0 2.0)) and__13__auto)))))) field-head?))) + (def-var! "jolt.analyzer" "analyze-dot" (letrec ((analyze-dot (lambda (ctx items env) (let fnrec1626 ((ctx ctx) (items items) (env env)) (begin (if (< (jolt-count items) 3.0) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (. target member ...) form")) jolt-nil) (let* ((member (jolt-nth items 2.0))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-sym?") member)) (let* ((_o$1628 (keyword #f "op")) (_o$1629 (keyword #f "host-call")) (_o$1630 (keyword #f "method")) (_o$1631 (jolt-invoke (var-deref "jolt.host" "form-sym-name") member)) (_o$1632 (keyword #f "target")) (_o$1633 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (_o$1634 (keyword #f "args")) (_o$1635 (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__53_) (let fnrec1627 ((p__53_ p__53_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__53_ env))) (jolt-drop 3.0 items)))) (jolt-hash-map _o$1628 _o$1629 _o$1630 _o$1631 _o$1632 _o$1633 _o$1634 _o$1635)) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "special form . (non-symbol member)")))))))) analyze-dot))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec1636 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2.0) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (.-field target) form")) jolt-nil) (let* ((_o$1637 (keyword #f "op")) (_o$1638 (keyword #f "host-call")) (_o$1639 (keyword #f "method")) (_o$1640 (jolt-invoke (var-deref "clojure.core" "subs") hname 1.0)) (_o$1641 (keyword #f "target")) (_o$1642 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (_o$1643 (keyword #f "args")) (_o$1644 (jolt-vector))) (jolt-hash-map _o$1637 _o$1638 _o$1639 _o$1640 _o$1641 _o$1642 _o$1643 _o$1644))))))) analyze-field))) + (def-var! "jolt.analyzer" "field-head?" (letrec ((field-head? (lambda (nm) (let fnrec1636 ((nm nm)) (let* ((and__13__auto (> (jolt-count nm) 2.0))) (if (jolt-truthy? and__13__auto) (jolt= ".-" (jolt-invoke (var-deref "clojure.core" "subs") nm 0.0 2.0)) and__13__auto)))))) field-head?))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec1645 ((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"))) (jolt-invoke (var-deref "jolt.ir" "var-ref") (jolt-get r (keyword #f "ns")) (jolt-get r (keyword #f "name"))) (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__39 (jolt-get r (keyword #f "kind")))) (if (jolt= G__39 (keyword #f "var")) (jolt-invoke (var-deref "jolt.ir" "var-ref") (jolt-get r (keyword #f "ns")) (jolt-get r (keyword #f "name"))) (if (jolt= G__39 (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-field" (letrec ((analyze-field (lambda (ctx hname items env) (let fnrec1637 ((ctx ctx) (hname hname) (items items) (env env)) (begin (if (< (jolt-count items) 2.0) (jolt-throw (jolt-invoke (var-deref "clojure.core" "str") "Malformed (.-field target) form")) jolt-nil) (let* ((_o$1638 (keyword #f "op")) (_o$1639 (keyword #f "host-call")) (_o$1640 (keyword #f "method")) (_o$1641 (jolt-invoke (var-deref "clojure.core" "subs") hname 1.0)) (_o$1642 (keyword #f "target")) (_o$1643 (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx (jolt-nth items 1.0) env)) (_o$1644 (keyword #f "args")) (_o$1645 (jolt-vector))) (jolt-hash-map _o$1638 _o$1639 _o$1640 _o$1641 _o$1642 _o$1643 _o$1644 _o$1645))))))) analyze-field))) (guard (e (#t #f)) - (def-var! "jolt.analyzer" "analyze-list" (letrec ((analyze-list (lambda (ctx form env) (let fnrec1646 ((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 hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") hname) and__13__auto)) 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))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ctor") ctx (jolt-invoke (var-deref "clojure.core" "subs") hname 0.0 (jolt-dec (jolt-count hname))) (jolt-rest items) env) (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.0))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1.0)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ctor") ctx (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1.0)) (jolt-drop 2.0 items) env) (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? (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? (keyword #f "else")) (let* ((n (jolt-invoke (var-deref "jolt.ir" "invoke") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env) (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__54_) (let fnrec1647 ((p__54_ p__54_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__54_ env))) (jolt-rest items)))) (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-symbol" (letrec ((analyze-symbol (lambda (ctx form env) (let fnrec1646 ((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"))) (jolt-invoke (var-deref "jolt.ir" "var-ref") (jolt-get r (keyword #f "ns")) (jolt-get r (keyword #f "name"))) (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__39 (jolt-get r (keyword #f "kind")))) (if (jolt= G__39 (keyword #f "var")) (jolt-invoke (var-deref "jolt.ir" "var-ref") (jolt-get r (keyword #f "ns")) (jolt-get r (keyword #f "name"))) (if (jolt= G__39 (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" (letrec ((analyze (case-lambda ((ctx form) (let fnrec1648 ((ctx ctx) (form form)) (jolt-invoke analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env") )))) ((ctx form env) (let fnrec1649 ((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") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__55_) (let fnrec1666 ((p__55_ p__55_)) (jolt-invoke analyze ctx p__55_ env))) (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.ir" "map-node") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p) (let fnrec1663 ((p p)) (let* ((_o$1664 (jolt-invoke analyze ctx (jolt-first p) env)) (_o$1665 (jolt-invoke analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$1664 _o$1665)))) (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.ir" "set-node") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__56_) (let fnrec1662 ((p__56_ p__56_)) (jolt-invoke analyze ctx p__56_ env))) (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (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$1658 (keyword #f "op")) (_o$1659 (keyword #f "regex")) (_o$1660 (keyword #f "source")) (_o$1661 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$1658 _o$1659 _o$1660 _o$1661)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$1654 (keyword #f "op")) (_o$1655 (keyword #f "inst")) (_o$1656 (keyword #f "source")) (_o$1657 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$1654 _o$1655 _o$1656 _o$1657)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$1650 (keyword #f "op")) (_o$1651 (keyword #f "uuid")) (_o$1652 (keyword #f "source")) (_o$1653 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$1650 _o$1651 _o$1652 _o$1653)) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "jolt.analyzer" "uncompilable") "unsupported form") jolt-nil))))))))))))))) analyze))) + (def-var! "jolt.analyzer" "analyze-list" (letrec ((analyze-list (lambda (ctx form env) (let fnrec1647 ((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 hname)) (if (jolt-truthy? and__13__auto) (let* ((and__13__auto (jolt-not shadowed))) (if (jolt-truthy? and__13__auto) (jolt-contains? (var-deref "jolt.analyzer" "handled") hname) and__13__auto)) 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))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ctor") ctx (jolt-invoke (var-deref "clojure.core" "subs") hname 0.0 (jolt-dec (jolt-count hname))) (jolt-rest items) env) (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.0))) (if (jolt-truthy? and__13__auto) (jolt-invoke (var-deref "jolt.host" "form-sym?") (jolt-nth items 1.0)) and__13__auto)) and__13__auto)) and__13__auto))) (jolt-invoke (var-deref "jolt.analyzer" "analyze-ctor") ctx (jolt-invoke (var-deref "jolt.host" "form-sym-name") (jolt-nth items 1.0)) (jolt-drop 2.0 items) env) (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? (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? (keyword #f "else")) (let* ((n (jolt-invoke (var-deref "jolt.ir" "invoke") (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx head env) (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__54_) (let fnrec1648 ((p__54_ p__54_)) (jolt-invoke (var-deref "jolt.analyzer" "analyze") ctx p__54_ env))) (jolt-rest items)))) (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 fnrec1649 ((ctx ctx) (form form)) (jolt-invoke analyze ctx form (jolt-invoke (var-deref "jolt.analyzer" "empty-env") )))) ((ctx form env) (let fnrec1650 ((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") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__55_) (let fnrec1667 ((p__55_ p__55_)) (jolt-invoke analyze ctx p__55_ env))) (jolt-invoke (var-deref "jolt.host" "form-vec-items") form))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-map?") form)) (jolt-invoke (var-deref "jolt.ir" "map-node") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p) (let fnrec1664 ((p p)) (let* ((_o$1665 (jolt-invoke analyze ctx (jolt-first p) env)) (_o$1666 (jolt-invoke analyze ctx (jolt-invoke (var-deref "clojure.core" "second") p) env))) (jolt-vector _o$1665 _o$1666)))) (jolt-invoke (var-deref "jolt.host" "form-map-pairs") form))) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-set?") form)) (jolt-invoke (var-deref "jolt.ir" "set-node") (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (p__56_) (let fnrec1663 ((p__56_ p__56_)) (jolt-invoke analyze ctx p__56_ env))) (jolt-invoke (var-deref "jolt.host" "form-set-items") form))) (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$1659 (keyword #f "op")) (_o$1660 (keyword #f "regex")) (_o$1661 (keyword #f "source")) (_o$1662 (jolt-invoke (var-deref "jolt.host" "form-regex-source") form))) (jolt-hash-map _o$1659 _o$1660 _o$1661 _o$1662)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-inst?") form)) (let* ((_o$1655 (keyword #f "op")) (_o$1656 (keyword #f "inst")) (_o$1657 (keyword #f "source")) (_o$1658 (jolt-invoke (var-deref "jolt.host" "form-inst-source") form))) (jolt-hash-map _o$1655 _o$1656 _o$1657 _o$1658)) (if (jolt-truthy? (jolt-invoke (var-deref "jolt.host" "form-uuid?") form)) (let* ((_o$1651 (keyword #f "op")) (_o$1652 (keyword #f "uuid")) (_o$1653 (keyword #f "source")) (_o$1654 (jolt-invoke (var-deref "jolt.host" "form-uuid-source") form))) (jolt-hash-map _o$1651 _o$1652 _o$1653 _o$1654)) (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$1046 "+") (_o$1047 "+") (_o$1048 "-") (_o$1049 "-") (_o$1050 "*") (_o$1051 "*") (_o$1052 "/") (_o$1053 "/") (_o$1054 "<") (_o$1055 "<") (_o$1056 ">") (_o$1057 ">") (_o$1058 "<=") (_o$1059 "<=") (_o$1060 ">=") (_o$1061 ">=") (_o$1062 "=") (_o$1063 "jolt=") (_o$1064 "inc") (_o$1065 "jolt-inc") (_o$1066 "dec") (_o$1067 "jolt-dec") (_o$1068 "not") (_o$1069 "jolt-not") (_o$1070 "min") (_o$1071 "min") (_o$1072 "max") (_o$1073 "max") (_o$1074 "mod") (_o$1075 "modulo") (_o$1076 "rem") (_o$1077 "remainder") (_o$1078 "quot") (_o$1079 "quotient") (_o$1080 "vector") (_o$1081 "jolt-vector") (_o$1082 "hash-map") (_o$1083 "jolt-hash-map") (_o$1084 "hash-set") (_o$1085 "jolt-hash-set") (_o$1086 "conj") (_o$1087 "jolt-conj") (_o$1088 "get") (_o$1089 "jolt-get") (_o$1090 "nth") (_o$1091 "jolt-nth") (_o$1092 "count") (_o$1093 "jolt-count") (_o$1094 "assoc") (_o$1095 "jolt-assoc") (_o$1096 "dissoc") (_o$1097 "jolt-dissoc") (_o$1098 "contains?") (_o$1099 "jolt-contains?") (_o$1100 "empty?") (_o$1101 "jolt-empty?") (_o$1102 "peek") (_o$1103 "jolt-peek") (_o$1104 "pop") (_o$1105 "jolt-pop") (_o$1106 "first") (_o$1107 "jolt-first") (_o$1108 "rest") (_o$1109 "jolt-rest") (_o$1110 "next") (_o$1111 "jolt-next") (_o$1112 "seq") (_o$1113 "jolt-seq") (_o$1114 "cons") (_o$1115 "jolt-cons") (_o$1116 "list") (_o$1117 "jolt-list") (_o$1118 "reverse") (_o$1119 "jolt-reverse") (_o$1120 "last") (_o$1121 "jolt-last") (_o$1122 "map") (_o$1123 "jolt-map") (_o$1124 "filter") (_o$1125 "jolt-filter") (_o$1126 "remove") (_o$1127 "jolt-remove") (_o$1128 "reduce") (_o$1129 "jolt-reduce") (_o$1130 "into") (_o$1131 "jolt-into") (_o$1132 "concat") (_o$1133 "jolt-concat") (_o$1134 "apply") (_o$1135 "jolt-apply") (_o$1136 "range") (_o$1137 "jolt-range") (_o$1138 "take") (_o$1139 "jolt-take") (_o$1140 "drop") (_o$1141 "jolt-drop") (_o$1142 "keys") (_o$1143 "jolt-keys") (_o$1144 "vals") (_o$1145 "jolt-vals") (_o$1146 "even?") (_o$1147 "jolt-even?") (_o$1148 "odd?") (_o$1149 "jolt-odd?") (_o$1150 "pos?") (_o$1151 "jolt-pos?") (_o$1152 "neg?") (_o$1153 "jolt-neg?") (_o$1154 "zero?") (_o$1155 "jolt-zero?") (_o$1156 "identity") (_o$1157 "jolt-identity") (_o$1158 "ex-info") (_o$1159 "jolt-ex-info")) (jolt-hash-map _o$1046 _o$1047 _o$1048 _o$1049 _o$1050 _o$1051 _o$1052 _o$1053 _o$1054 _o$1055 _o$1056 _o$1057 _o$1058 _o$1059 _o$1060 _o$1061 _o$1062 _o$1063 _o$1064 _o$1065 _o$1066 _o$1067 _o$1068 _o$1069 _o$1070 _o$1071 _o$1072 _o$1073 _o$1074 _o$1075 _o$1076 _o$1077 _o$1078 _o$1079 _o$1080 _o$1081 _o$1082 _o$1083 _o$1084 _o$1085 _o$1086 _o$1087 _o$1088 _o$1089 _o$1090 _o$1091 _o$1092 _o$1093 _o$1094 _o$1095 _o$1096 _o$1097 _o$1098 _o$1099 _o$1100 _o$1101 _o$1102 _o$1103 _o$1104 _o$1105 _o$1106 _o$1107 _o$1108 _o$1109 _o$1110 _o$1111 _o$1112 _o$1113 _o$1114 _o$1115 _o$1116 _o$1117 _o$1118 _o$1119 _o$1120 _o$1121 _o$1122 _o$1123 _o$1124 _o$1125 _o$1126 _o$1127 _o$1128 _o$1129 _o$1130 _o$1131 _o$1132 _o$1133 _o$1134 _o$1135 _o$1136 _o$1137 _o$1138 _o$1139 _o$1140 _o$1141 _o$1142 _o$1143 _o$1144 _o$1145 _o$1146 _o$1147 _o$1148 _o$1149 _o$1150 _o$1151 _o$1152 _o$1153 _o$1154 _o$1155 _o$1156 _o$1157 _o$1158 _o$1159)) (jolt-hash-map (keyword #f "private") #t))) (guard (e (#t #f)) diff --git a/host/chez/seed/prelude.ss b/host/chez/seed/prelude.ss index 7f3f779..02b788b 100644 --- a/host/chez/seed/prelude.ss +++ b/host/chez/seed/prelude.ss @@ -495,15 +495,15 @@ (guard (e (#t #f)) (def-var! "clojure.core" "ifn?" (letrec ((ifn? (lambda (x) (let fnrec882 ((x x)) (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "fn?") x))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "keyword?") x))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "symbol?") x))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "map?") x))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "set?") x))) (if (jolt-truthy? or__14__auto) or__14__auto (let* ((or__14__auto (jolt-invoke (var-deref "clojure.core" "vector?") x))) (if (jolt-truthy? or__14__auto) or__14__auto (jolt-invoke (var-deref "clojure.core" "var?") x))))))))))))))))) ifn?))) (guard (e (#t #f)) - (def-var! "clojure.core" "+" (jolt-symbol #f "+"))) + (def-var! "clojure.core" "+'" jolt-add)) (guard (e (#t #f)) - (def-var! "clojure.core" "-" (jolt-symbol #f "-"))) + (def-var! "clojure.core" "-'" jolt-sub)) (guard (e (#t #f)) - (def-var! "clojure.core" "*" (jolt-symbol #f "*"))) + (def-var! "clojure.core" "*'" jolt-mul)) (guard (e (#t #f)) - (def-var! "clojure.core" "inc" (jolt-symbol #f "inc"))) + (def-var! "clojure.core" "inc'" jolt-inc)) (guard (e (#t #f)) - (def-var! "clojure.core" "dec" (jolt-symbol #f "dec"))) + (def-var! "clojure.core" "dec'" jolt-dec)) (guard (e (#t #f)) (def-var! "clojure.core" "unchecked-add" (letrec ((unchecked-add (lambda (x y) (let fnrec883 ((x x) (y y)) (+ x y))))) unchecked-add))) (guard (e (#t #f)) diff --git a/jolt-core/jolt/analyzer.clj b/jolt-core/jolt/analyzer.clj index ac4f757..ccd61e1 100644 --- a/jolt-core/jolt/analyzer.clj +++ b/jolt-core/jolt/analyzer.clj @@ -136,11 +136,28 @@ ;; but keeps a fixed arity a nil-free struct rather than a phm. (if rst (assoc arity :rest rst) arity))) +;; A reader that lowers ^meta on a collection to a runtime (with-meta ) +;; form (the Chez data reader) wraps an arglist vector carrying a return-type hint +;; (^bytes [b] / ^String [x y]). Unwrap to the underlying vector so fn parsing sees +;; the params — the hint is ignored at runtime. Only the (with-meta _) shape +;; matches, so a real arity clause (head is a vector) and the Janet reader's +;; meta-on-tuple (already a vector) pass through unchanged. +(defn- strip-arglist-meta [form] + (if (form-list? form) + (let [es (vec (form-elements form))] + (if (and (= 3 (count es)) + (form-sym? (first es)) + (= "with-meta" (form-sym-name (first es))) + (form-vec? (nth es 1))) + (nth es 1) + form)) + form)) + (defn- analyze-fn [ctx items env] (let [named (form-sym? (nth items 1)) fn-name (when named (form-sym-name (nth items 1))) rest-items (if named (drop 2 items) (drop 1 items)) - first* (first rest-items)] + first* (strip-arglist-meta (first rest-items))] (cond (form-vec? first*) (fn-node fn-name [(analyze-arity ctx first* (rest rest-items) env fn-name)]) @@ -148,7 +165,7 @@ (fn-node fn-name (mapv (fn [clause] (let [cl (vec (form-elements clause))] - (analyze-arity ctx (first cl) (rest cl) env fn-name))) + (analyze-arity ctx (strip-arglist-meta (first cl)) (rest cl) env fn-name))) rest-items)) :else (uncompilable "fn: bad params")))) diff --git a/test/chez/run-corpus-zero-janet.janet b/test/chez/run-corpus-zero-janet.janet index 4280871..082e25c 100644 --- a/test/chez/run-corpus-zero-janet.janet +++ b/test/chez/run-corpus-zero-janet.janet @@ -203,7 +203,9 @@ (when (os/getenv "JOLT_DUMP_CRASH_LABELS") (printf "\nCRASH LABELS:") (each [l k] (sort-by (fn [pair] (get pair 1)) crashes) - (printf " [%s] :: %s" k l))) + (printf " [%s] :: %s" k l)) + (printf "\nKNOWN-HIT LABELS:") + (each l (sort known-hit) (printf " %s" l))) (when (> (length diverged) 0) (printf "\nNEW divergences (ran, wrong value) — gate FAILS:") (each [l m] (slice diverged 0 (min 40 (length diverged)))