Clojure 导入与 :import

发布于 2024-11-20 00:37:57 字数 269 浏览 6 评论 0原文

阅读用于导入的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

忆沫 2024-11-27 00:37:57

这是我首选的工作流程:

  • 启动 Swank/Slime
  • 在 Emacs 中打开我想要处理的文件
  • Do Cc Ck 编译并加载有问题的文件
  • Do , 后跟 < kbd>i,然后输入您正在使用的命名空间的名称,然后按 Enter

现在您的 Slime REPL 应该位于您正在使用的命名空间中,您可以在顶部添加 ns 声明,并在更改内容时添加 Cc Ck(包括您的 ns 导入)。

Here is my preferred workflow:

  • Start Swank/Slime
  • Open the file I want to work on in Emacs
  • Do C-c C-k to compile and load the file in question
  • Do , followed by i, then type the name of the namespace you're working on and press Enter

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 your ns imports).

土豪我们做朋友吧 2024-11-27 00:37:57

我不确定为什么 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.

挥剑断情 2024-11-27 00:37:57

(ns ... ) 形式是首选,因为您的代码将更容易阅读。所有命名空间声明都将收集在文件的顶部。您会看到编译器在 Java 等语言中强制执行此操作。此外,包含宏 ns 使您无需引用符号。 use、import、refer 等也是如此。

我认为 Cx Ce slime 快捷方式会将这段代码发送到连接的 swank 服务器,并对其进行评估。例如,表单:

(ns my.test
   (:require [clojure.contrib.logging :as log])
   (:import [java.io File]))

将创建一个名为 my.test 的新命名空间,其中包括 contrib 日志记录和 java.io 文件。它不会更改 repl 的命名空间。为此,请从您正在编辑的文件中按Cc Mp,系统将提示您输入要切换到的文件的命名空间名称(除非您已经位于该命名空间中)。按 Enter 键进行选择。 Cc Cz 应该切换到 repl。现在,您应该看到 my.test=>,而不是 user=> 提示,表明您位于该命名空间中。

我设置的工作流程是在保存时编译整个文件,使用:

(defun ed/clojure-compile-on-save (&optional args)
  "Compile with slime on save"
  (interactive)
  (if (and (eq major-mode 'clojure-mode)
      (slime-connected-p))
      (slime-compile-and-load-file)))
(add-hook 'after-save-hook 'ed/clojure-compile-on-save)

这样,当我保存文件时,它就会由 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:

(ns my.test
   (:require [clojure.contrib.logging :as log])
   (:import [java.io File]))

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 the user=> prompt, you should see my.test=>, indicating that you are in that namespace.

The workflow I have set-up is to compile the whole file on save, using:

(defun ed/clojure-compile-on-save (&optional args)
  "Compile with slime on save"
  (interactive)
  (if (and (eq major-mode 'clojure-mode)
      (slime-connected-p))
      (slime-compile-and-load-file)))
(add-hook 'after-save-hook 'ed/clojure-compile-on-save)

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.

往昔成烟 2024-11-27 00:37:57

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 in ns 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文