Clojure导入与:导入

时间:2011-07-13 01:32:07

标签: emacs clojure slime

读取clojure API以进行导入我看到:ns宏中的import最好导入,但是当我使用swank / slime / emacs进行编码时,我不能cx ce(ns ..)s-表达式让deps进入repl,但是使用(import ...)我可以。

原因是什么:导入比导入更受欢迎,是否有快速方法将(ns ...)s-expr中的deps从我的.clj文件导入到repl? (同样的问题可以概括为:使用和:参考..谢谢)

4 个答案:

答案 0 :(得分:5)

以下是我首选的工作流程:

  • 启动Swank / Slime
  • 在Emacs中打开我要处理的文件
  • 执行 C-c C-k 编译并加载有问题的文件
  • 执行后跟 i ,然后输入您正在处理的命名空间的名称,然后按 Enter

现在你的Slime REPL应该在你正在处理的命名空间中,你可以在更改内容时添加到顶部的ns声明和 Cc Ck (包括你的ns进口商品。

答案 1 :(得分:2)

我不确定为什么c-x c-e不起作用,但只要命名空间已经存在,ns表达式上的C-c C-c就能正常工作。

答案 2 :(得分:2)

(ns ...)表单是首选,因为您的代码将更容易阅读。所有命名空间声明都将收集在文件的顶部。您会看到编译器在Java等语言中强制执行此操作。此外,包含宏ns不需要您引用符号。使用,导入,引用等也可以这样说。

我认为C-x C-e slime short-cut会将这段代码发送到连接的swank服务器,并对其进行评估。例如表格:

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

将创建一个名为my.test的新命名空间,其中包括contrib logging和java.io File。它不会更改repl的命名空间。为此,请从您正在编辑的文件中按C-c M-p,系统将提示您切换到该文件的命名空间名称(除非您已经在该命名空间中)。按enter键进行选择。 C-c C-z应切换到repl。现在,您应该看到user=>而不是my.test=>提示符,表明您在该命名空间中。

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

(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进行实验。

答案 3 :(得分:1)

:ns声明中的import是首选,因为它在一个地方保留了与命名空间有关的所有内容,通常位于文件的顶部。这是一种很好的编码实践。

我认为评估ns声明 C-x C-e 的原因不起作用是SLIME工作方式的一部分。当你评估一个sexp时,SLIME会在当前的命名空间中执行它。因此,evaling (import 'java.io.File)会将File导入到ns目前的任何名称空间中。

evaling(ns my.namespace(:import java.io.File)声明确实会修改声明中指示的命名空间,但它不会更改ns的值。除非您更改为该命名空间(在-ns'my.namespace中),您将看不到导入