ns*
special form | since v1.9.293 | Edit |
(defmethod parse 'ns*
[_ env [_ quoted-specs :as form] _ opts]
(when-let [not-quoted (->> (remove keyword? quoted-specs)
(remove #(and (seq? %) (= 'quote (first %))) )
first)]
(throw (error env (str "Arguments to " (name (first quoted-specs))
" must be quoted. Offending spec: " not-quoted))))
(when-not *allow-ns*
(throw (error env (str "Calls to `" (name (first quoted-specs))
"` must appear at the top-level."))))
(let [specs (if (= :import (first quoted-specs))
(canonicalize-import-specs quoted-specs)
(canonicalize-specs quoted-specs))
name (-> env :ns :name)
args (desugar-ns-specs
#?(:clj (list (process-rewrite-form
specs))
:cljs (list specs)))
{:keys [as-aliases] args :libspecs} (nses/elide-aliases-from-ns-specs args)
{excludes :excludes core-renames :renames} (parse-ns-excludes env args)
core-renames (reduce (fn [m [original renamed]]
(assoc m renamed (symbol "cljs.core" (str original))))
{} core-renames)
deps (atom [])
aliases (atom {:fns as-aliases :macros as-aliases})
spec-parsers {:require (partial parse-require-spec env false deps aliases)
:require-macros (partial parse-require-spec env true deps aliases)
:use (comp (partial parse-require-spec env false deps aliases)
(partial use->require env))
:use-macros (comp (partial parse-require-spec env true deps aliases)
(partial use->require env))
:import (partial parse-import-spec env deps)}
reload (atom {:use nil :require nil :use-macros nil :require-macros nil})
reloads (atom {})
{uses :use requires :require renames :rename
use-macros :use-macros require-macros :require-macros
rename-macros :rename-macros imports :import :as params}
(reduce
(fn [m [k & libs]]
(when-not (= :import k)
(when (some? (some #{:reload} libs))
(swap! reload assoc k :reload))
(when (some? (some #{:reload-all} libs))
(swap! reload assoc k :reload-all)))
(when-some [xs (seq (filter #(-> % meta :reload) libs))]
(swap! reloads assoc k
(zipmap (map first xs) (map #(-> % meta :reload) xs))))
(apply merge-with merge m
(map (spec-parsers k)
(remove #{:reload :reload-all} libs))))
{} (remove (fn [[r]] (= r :refer-clojure)) args))]
(set! *cljs-ns* name)
(let [require-info
{:as-aliases as-aliases
:name name
:excludes excludes
:use-macros use-macros
:require-macros require-macros
:rename-macros rename-macros
:uses uses
:requires requires
:renames (merge renames core-renames)
:imports imports}]
(swap! env/*compiler* update-in [::namespaces name] merge-ns-info require-info env)
(merge {:op :ns*
:env env
:form form
:deps (into [] (distinct @deps))
:reload @reload
:reloads @reloads}
(cond-> require-info
(@reload :use)
(update-in [:uses]
(fn [m] (with-meta m {(@reload :use) true})))
(@reload :require)
(update-in [:requires]
(fn [m] (with-meta m {(@reload :require) true}))))))))
(defmethod emit* :ns*
[{:keys [name requires uses require-macros reloads env deps]}]
(load-libs requires nil (:require reloads) deps name)
(load-libs uses requires (:use reloads) deps name)
(when (:repl-env env)
(emitln "'nil';")))