Clojure 导入与 :import
阅读用于导入的 clojure API,我发现 ns 宏中的 :import 优先于导入,但是当我使用 swank/slime/emacs 进行编码时,我无法 cx ce (ns .. ) s-表达式来获取将 deps 放入 repl 中,但是使用 (import ...) 我可以。
:import 优于 import 的原因是什么,有没有快速的方法将 deps 从 (ns ...) s-expr 从我的 .clj 文件导入到 repl? (同样的问题可以概括为 :use 和 :refer ..谢谢)
Reading the clojure API for import I see that :import in the ns macro is preferred to import, however when i'm coding using swank/slime/emacs, I can't c-x c-e the (ns .. ) s-expression to get the deps into the repl, but using (import ...) I can.
Whats the reason why :import is preferred over import, and is there fast way to import the deps from a (ns ...) s-expr from my .clj file to the repl? (Same question can be generalized to :use and :refer.. thanks)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是我首选的工作流程:
现在您的 Slime REPL 应该位于您正在使用的命名空间中,您可以在顶部添加
ns
声明,并在更改内容时添加 Cc Ck(包括您的ns
导入)。Here is my preferred workflow:
Now your Slime REPL should be in the namespace you're working on, and you can add to the
ns
declaration at the top and just C-c C-k as you change things (including yourns
imports).我不确定为什么 cx ce 不起作用,但只要命名空间已经存在, ns 表达式上的 Cc Cc 就可以正常工作。
I'm not sure why c-x c-e wouldn't work, but C-c C-c on the ns expression does work correctly as long as the namespace already exists.
(ns ... ) 形式是首选,因为您的代码将更容易阅读。所有命名空间声明都将收集在文件的顶部。您会看到编译器在 Java 等语言中强制执行此操作。此外,包含宏 ns 使您无需引用符号。 use、import、refer 等也是如此。
我认为
Cx Ce
slime 快捷方式会将这段代码发送到连接的 swank 服务器,并对其进行评估。例如,表单:将创建一个名为 my.test 的新命名空间,其中包括 contrib 日志记录和 java.io 文件。它不会更改 repl 的命名空间。为此,请从您正在编辑的文件中按
Cc Mp
,系统将提示您输入要切换到的文件的命名空间名称(除非您已经位于该命名空间中)。按 Enter 键进行选择。Cc Cz
应该切换到 repl。现在,您应该看到my.test=>
,而不是user=>
提示,表明您位于该命名空间中。我设置的工作流程是在保存时编译整个文件,使用:
这样,当我保存文件时,它就会由 swank 服务器编译和加载,并且我使用 repl 在命名空间 I' 中进行实验我正在努力。
The (ns ... ) form is preferred since your code will read more easily. All the namespace declarations will be collected at the top of the file. You see this enforced by the compiler in languages like Java. Also, the containing macro ns removes the need for you to quote symbols. The same can be said of use, import, refer, etc.
I think that the
C-x C-e
slime short-cut will send the piece of code to the connected swank server, and have it evaluated. For example the form:will create a new namespace called my.test which includes contrib logging and java.io File. It will not change the namespace of the repl. To do that press
C-c M-p
from the file you are editing, and you will be prompted with the name of the namespace of that file to switch to (unless you are already in that namespace). Press enter to select.C-c C-z
should switch to the repl. Now instead of theuser=>
prompt, you should seemy.test=>
, indicating that you are in that namespace.The workflow I have set-up is to compile the whole file on save, using:
That way, when ever I save the file, it gets compiled and loaded by the swank server, and I use the repl for experiments in the namespace I'm working on.
ns 声明中的 :import 是首选,因为它将与命名空间有关的所有内容保留在一个位置,通常位于文件的顶部。这是良好的编码实践。
我相信评估 ns 声明 Cx Ce 不起作用的原因是 SLIME 工作方式的一部分。当您评估 sexp 时,SLIME 在当前命名空间中执行它。因此,评估
(import 'java.io.File)
会将 File 导入到当前ns
中的任何命名空间中。评估 (ns my.namespace (:import java.io.File) 声明确实会修改声明中指示的命名空间,但不会更改
ns
的值。除非您使用 (in-ns 'my.namespace) 更改为该名称空间,否则您将看不到导入:import in the ns declaration is preferred because it keeps everything to do with the namespace in one place, typically at the top of the file. This is good coding practice.
I believe the reason evaling the ns declaration C-x C-e does not work is part of the way SLIME works. When you eval an sexp , SLIME does it in the current namespace. So, evaling
(import 'java.io.File)
will import File into whatever namespace is inns
at the moment.evaling an (ns my.namespace (:import java.io.File) declaration does modify the namespace indicated in the declaration, but it does not change the value of
ns
. Unless you change to that namespace with (in-ns 'my.namespace), you will not see the import