Ant*_*ald 3 clojure clojurescript
当我在clojure-script源文件中需要一个命名空间时,我可以在代码中使用它.
例如:
(ns my.core
(:require [mylib.core :as lib]))
(lib/my-f)
(def something 99)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试(lib/my-f)在repl中调用- 在通过(ns my.core)- 更改命名空间后- 我无法访问它.相比之下,ns中的所有其他定义都是可访问的:something例如上面的示例.
有没有办法访问repl中的需求?或者我每次都必须在repl中手动要求它们?当然,这将非常繁琐.
如果您ns在ClojureScript REPL中使用更改命名空间,则会将命名空间别名设置为与ns表单中使用的别名相匹配.
这是一个说明这个概念的例子:
$ clj -m cljs.main
ClojureScript 1.10.520
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
Run Code Online (Sandbox Code Playgroud)
相反,如果使用in-nsREPL special来更改为现有命名空间,则会保留别名:
$ clj -m cljs.main
ClojureScript 1.10.520
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
Run Code Online (Sandbox Code Playgroud)
一个有趣的相关方面:如果您使用requireREPL special,它将在引擎盖下使用一个ns带有特殊元的表单,该表单将保留现有别名:
$ clj -m cljs.main
ClojureScript 1.10.520
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
Run Code Online (Sandbox Code Playgroud)
如果你很好奇,这就是: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
通过查看其工作原理,它应该提供一些深入了解为什么ns直接在REPL中评估的表单(没有mergemeta)可以导致别名被清除.
简而言之,避免直接使用nsspecial来更改REPL中的命名空间.而是使用它在REPL中创建新的命名空间,同时指定任何所需的命名空间.
使用in-nsREPL special切换到现有命名空间.它还可用于创建新的命名空间.
用于require将命名空间加载到REPL中,然后用于in-ns切换到它们.
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |