inc I (jolt-n7rz) — vars as first-class objects. (var x)/#'x lowered a :the-var IR op the Chez emitter didn't handle (57 emit-fails, the biggest bucket); emit it to the rt.ss var-cell and shim the static var ops in vars.ss: var?/var-get/deref/var-as-IFn/var =/pr-str (#'ns/name) + a native bound? (the overlay reads (get v :root), nil on a var-cell record). def now RETURNS the var (#'ns/name) like Clojure — def-var!/declare-var! yield the cell, not the value — so (var? (def x 1)) is true and pr-str-of-var/defn pass (un-allowlisted). Dynamic binding (binding/with-bindings*/var-set/ thread-bound?) stays a follow-up; those crash on nil host prims (safe). Var def-time metadata (^:private/^Type/doc) isn't captured yet — allowlisted. inc J (jolt-snry) — scalar natives. natives-misc.ss: a juuid record (random-uuid v4 / parse-uuid / uuid? / #uuid pr-str / str), a %-format engine (%d/%s/%.Nf/%x/%c/%%; printf rides on it), a jtagged record (tagged-literal + :tag/:form + #tag pr-str), bigint/biginteger as near-identity over the all-flonum model. Overlay names (uuid?/random-uuid/ parse-uuid/tagged-literal?) re-asserted in post-prelude.ss. Prelude parity 1898 -> 1951, 0 new divergences. Floor raised to 1951.
57 lines
2.6 KiB
Scheme
57 lines
2.6 KiB
Scheme
;; vars as first-class objects (jolt-cf1q.3, jolt-n7rz) — (var x) / #'x.
|
|
;;
|
|
;; The emitter lowers :the-var to (jolt-var ns name) — the rt.ss var-cell, which
|
|
;; is now also a Clojure VAR value. var? / var-get / deref-of-var / var-as-IFn /
|
|
;; var equality / pr-str(#'ns/name) operate on it. bound? is overridden natively
|
|
;; in post-prelude.ss (the overlay reads (get v :root), nil on a record).
|
|
;;
|
|
;; Dynamic binding (binding / with-bindings* / var-set / thread-bound? /
|
|
;; with-redefs) is a separate follow-up — those crash on nil host primitives,
|
|
;; which is safe (a crash stays a crash, not a divergence).
|
|
;;
|
|
;; Loaded LAST (after natives-xform.ss): chains jolt-deref (atom/volatile arms)
|
|
;; and the printers.
|
|
|
|
(define (jolt-var-pred? x) (var-cell? x))
|
|
|
|
;; the var's current root; unbound is an error (Clojure throws on an unbound var).
|
|
(define (jolt-var-get v)
|
|
(if (var-cell? v)
|
|
(let ((r (var-cell-root v)))
|
|
(if (eq? r jolt-unbound) (error #f "Unbound var" v) r))
|
|
(error #f "var-get: not a var" v)))
|
|
|
|
;; deref of a var -> its root.
|
|
(define %v-deref jolt-deref)
|
|
(set! jolt-deref (lambda (x) (if (var-cell? x) (jolt-var-get x) (%v-deref x))))
|
|
|
|
;; a var is an IFn — invoking it invokes its root value ((var f) args -> (f args)).
|
|
(define %v-invoke jolt-invoke)
|
|
(set! jolt-invoke (lambda (f . args)
|
|
(if (var-cell? f) (apply jolt-invoke (var-cell-root f) args) (apply %v-invoke f args))))
|
|
|
|
;; two var cells are = iff same ns/name (Clojure var identity).
|
|
(define %v-=2 jolt=2)
|
|
(set! jolt=2 (lambda (a b)
|
|
(cond ((var-cell? a) (and (var-cell? b)
|
|
(string=? (var-cell-ns a) (var-cell-ns b))
|
|
(string=? (var-cell-name a) (var-cell-name b))))
|
|
((var-cell? b) #f)
|
|
(else (%v-=2 a b)))))
|
|
|
|
;; pr-str / str of a var -> #'ns/name.
|
|
(define (var->str v) (string-append "#'" (var-cell-ns v) "/" (var-cell-name v)))
|
|
(define %v-pr-str jolt-pr-str)
|
|
(set! jolt-pr-str (lambda (x) (if (var-cell? x) (var->str x) (%v-pr-str x))))
|
|
(define %v-pr-readable jolt-pr-readable)
|
|
(set! jolt-pr-readable (lambda (x) (if (var-cell? x) (var->str x) (%v-pr-readable x))))
|
|
(define %v-str-render-one jolt-str-render-one)
|
|
(set! jolt-str-render-one (lambda (x) (if (var-cell? x) (var->str x) (%v-str-render-one x))))
|
|
|
|
;; bound? — native (the overlay's (get v :root) is nil on a var-cell record).
|
|
(define (jolt-var-bound-one? v) (and (var-cell? v) (not (eq? (var-cell-root v) jolt-unbound))))
|
|
(define (jolt-bound? . vars) (if (for-all jolt-var-bound-one? vars) #t #f))
|
|
|
|
(def-var! "clojure.core" "var?" jolt-var-pred?)
|
|
(def-var! "clojure.core" "var-get" jolt-var-get)
|
|
(def-var! "clojure.core" "deref" jolt-deref)
|