Resolve :use/:only refers, refer-aware syntax-quote, alias-aware resolve

Three related namespace-resolution fixes surfaced porting the clojure.tools.logging
library, all general:

- chez-register-spec! treats a :use :only vector like :require :refer, so a
  (:use [ns :only [names]]) clause actually brings those names in. Before, a bare
  reference to an :only'd name resolved to nil.
- syntax-quote (hc-sq-symbol) qualifies a referred name to its SOURCE namespace,
  not the compile namespace — so a macro that syntax-quotes a referred var (e.g.
  clojure.tools.logging/spy reaching clojure.pprint's pprint) expands correctly.
- resolve consults :as aliases and :refers like ns-resolve does; (resolve
  'alias/name) was returning nil because the alias wasn't expanded.
This commit is contained in:
Yogthos 2026-06-22 10:25:35 -04:00
parent 45876998ad
commit ccf93c896a
2 changed files with 17 additions and 4 deletions

View file

@ -67,7 +67,9 @@
(cond
((string=? (keyword-t-name k) "as")
(when (symbol-t? v) (chez-register-alias! cns (symbol-t-name v) target)))
((string=? (keyword-t-name k) "refer")
;; :refer (require) and :only (use) both bring unqualified names
;; into cns resolving to target/name.
((or (string=? (keyword-t-name k) "refer") (string=? (keyword-t-name k) "only"))
(cond
;; :refer :all — bring in every public var (require :refer :all)
((and (keyword? v) (string=? (keyword-t-name v) "all"))
@ -196,11 +198,16 @@
;; resolve: an unqualified symbol resolves in the current ns then clojure.core; a
;; qualified one in its own ns. Returns the var iff genuinely defined, else nil —
;; never interns an empty cell (var-cell-lookup is non-creating).
;; resolve `sym` in the current ns: a qualified ns part is read as an :as alias
;; (then a real ns); an unqualified name resolves in the current ns, its :refers,
;; then clojure.core. (ns-resolve does the same against an explicit ns.)
(define (jolt-resolve sym)
(let* ((sns (symbol-t-ns sym)) (nm (symbol-t-name sym))
(let* ((cns (chez-current-ns))
(sns (symbol-t-ns sym)) (nm (symbol-t-name sym))
(c (if (string? sns)
(var-cell-lookup sns nm)
(or (var-cell-lookup (chez-current-ns) nm)
(var-cell-lookup (or (chez-resolve-alias cns sns) sns) nm)
(or (var-cell-lookup cns nm)
(let ((ref (chez-resolve-refer cns nm))) (and ref (var-cell-lookup ref nm)))
(var-cell-lookup "clojure.core" nm)))))
(if (and c (var-cell-defined? c)) c jolt-nil)))