diff --git a/src/jolt/evaluator.janet b/src/jolt/evaluator.janet index 206444d..a9b0d8c 100644 --- a/src/jolt/evaluator.janet +++ b/src/jolt/evaluator.janet @@ -774,11 +774,13 @@ (defn use-impl "(use '[ns ...] ...) — refer ALL public vars of each used ns into the CURRENT ns. - A fn; quoted specs arrive evaluated. Each spec is a ns symbol or [ns & opts]." + A fn; quoted specs arrive evaluated. Each spec is a ns symbol or a [ns & opts] + vector (a pvec/tuple, not a Janet array — coerce, then take the head as the ns)." [ctx & specs] (def target-ns (ctx-find-ns ctx (ctx-current-ns ctx))) (each s specs - (let [ns-sym (if (array? s) (in s 0) s) + (let [spec (if (pvec? s) (pv->array s) s) + ns-sym (if (indexed? spec) (in spec 0) spec) src-name (sym-name-str ns-sym)] (maybe-require-ns ctx src-name) (let [source-ns (ctx-find-ns ctx src-name)] diff --git a/test/integration/conformance-test.janet b/test/integration/conformance-test.janet index f400793..077913d 100644 --- a/test/integration/conformance-test.janet +++ b/test/integration/conformance-test.janet @@ -135,6 +135,8 @@ ### ---- HIGH: aliased namespace calls ---- ["require :as alias" "\"1,2,3\"" "(do (require (quote [clojure.string :as s])) (s/join \",\" [1 2 3]))"] + ["ns form + alias" "\"HI\"" "(do (ns my.a (:require [clojure.string :as s])) (s/upper-case \"hi\"))"] + ["ns :use refers" "42" "(do (ns src.u) (def helper 42) (ns dst.u (:use [src.u])) helper)"] ### ---- MED: missing core fns ---- ["peek vec" "3" "(peek [1 2 3])"] diff --git a/test/spec/namespaces-spec.janet b/test/spec/namespaces-spec.janet index 951d09f..f69ebc9 100644 --- a/test/spec/namespaces-spec.janet +++ b/test/spec/namespaces-spec.janet @@ -16,6 +16,11 @@ (defspec "namespaces / ns operations" ["in-ns switches" "true" "(do (in-ns 'my.ns) (symbol? 'x))"] + # ns is a macro over in-ns/require/use/import (Stage 2 jolt-eaa): the form sets + # the current ns and processes its clauses. + ["ns form + alias" "\"HI\"" "(do (ns my.app (:require [clojure.string :as s])) (s/upper-case \"hi\"))"] + ["ns :use refers all" "9" "(do (ns src.lib) (def helper 9) (ns dst.app (:use [src.lib])) helper)"] + ["standalone use" "7" "(do (ns src.l2) (def k 7) (in-ns 'dst.a2) (use '[src.l2]) k)"] ["ns-name" "true" "(do (require (quote [clojure.string])) (= 'clojure.string (ns-name (find-ns 'clojure.string))))"] ["find-ns existing" "true" "(some? (find-ns 'clojure.core))"] ["find-ns missing" "nil" "(find-ns 'does.not.exist)"]