如果使用ns
更改命名空間在ClojureScript REPL,這個命名空間設置別名匹配在ns
形式使用。
這裏是說明概念的例子:
$ java -jar cljs.jar -m cljs.repl.nashorn
To quit, type: :cljs/quit
cljs.user=> (ns foo.core (:require [clojure.string :as string]))
foo.core=> (string/starts-with? "abc" "a")
true
foo.core=> (ns bar.core)
bar.core=> (ns foo.core)
foo.core=> (string/starts-with? "abc" "a")
WARNING: No such namespace: string, could not locate string.cljs, string.cljc, or Closure namespace "" at line 1 <cljs repl>
WARNING: Use of undeclared Var string/starts-with? at line 1 <cljs repl>
ReferenceError: "string" is not defined
相反,如果你使用in-ns
REPL特殊切換到現有的命名空間,這將保留別名:
$ java -jar cljs.jar -m cljs.repl.nashorn
To quit, type: :cljs/quit
cljs.user=> (ns foo.core (:require [clojure.string :as string]))
foo.core=> (string/starts-with? "abc" "a")
true
foo.core=> (ns bar.core)
bar.core=> (in-ns 'foo.core)
nil
foo.core=> (string/starts-with? "abc" "a")
true
一個有趣的相關方面:如果您使用require
REPL特殊版,它將在引擎蓋下采用ns
表格,並將特殊元素烘焙到保留現有別名的表單中:
$ java -jar cljs.jar -m cljs.repl.nashorn
To quit, type: :cljs/quit
cljs.user=> (require '[clojure.string :as string])
nil
cljs.user=> (require '[clojure.string :as str])
nil
cljs.user=> (string/starts-with? "abc" "a")
true
cljs.user=> (str/starts-with? "abc" "a")
true
如果你很好奇,這是:merge true
元位置:https://github.com/clojure/clojurescript/blob/r1.7.228/src/main/clojure/cljs/repl.cljc#L679
,它是由分析器榮幸在這裏:https://github.com/clojure/clojurescript/blob/r1.7.228/src/main/clojure/cljs/analyzer.cljc#L1953
通過觀察是如何工作的,它應該提供一些洞察爲什麼在REPL中直接評估的ns
表單(無merge
元)可能會導致別名被清除。
總之,避免直接使用ns
special更改爲REPL中的命名空間。而是使用它在REPL中創建一個新的命名空間,同時指定任何必需的命名空間。
使用in-ns
REPL特別切換到現有名稱空間。它也可以用來創建一個新的名字空間。
使用require
將名稱空間加載到REPL中,然後使用in-ns
切換到它們。
感謝您的長時間答覆。 in-ns是我尋找的魔法。現在爲我節省了很多打字量.. –