2011-07-13 47 views
5

阅读clojure API导入我看到:导入ns宏是首选导入,但是当我使用swank/slime/emacs编码时,我不能cx ce(ns ..)s表达式来得到代表进入repl,但使用(进口...)我可以。Clojure导入与导入

什么原因为什么:导入优于导入,并有快速的方法来从(.ns ...)s-expr从我的.clj文件导入到repl? (同样的问题可以概括为:使用和:引用..谢谢)

回答

5

这里是我的首选的工作流程:

  • 开始斯旺克/泥
  • 打开我想在Emacs
  • 上工作不要抄送CK编译和问题
  • 加载文件的文件
  • 执行,后跟i,然后输入您正在处理的名称空间的名称,然后按进入

现在你的煤泥REPL应该是在你工作的命名空间,你可以在上面添加到ns声明,只是抄送CK为你改变的东西(包括你ns进口)。

+0

你最后的要点对我来说有点不清楚。你正在打“','在你正在处理的文件中?难道这不就是插入一个逗号和'我'吗? – ftravers

+0

当您的光标在Slime REPL缓冲区中时,在提示处输入其他内容之前,输入','。这将使文本“Command:”出现在迷你缓冲区中。现在立即输入'i',你会看到文本'Package:'出现在迷你缓冲区中。现在开始输入包的名称,根据需要使用tab-completion,直到您的名称空间的全名位于迷你缓冲区中。按下“ENTER”键,你的Slime REPL将会进入你的目标命名空间。 – semperos

2

我不确定为什么cx ce不会工作,但只要命名空间已存在ns表达式上的Cc Cc确实工作正常。

1

:在ns声明中导入是首选,因为它将所有与名称空间相关的所有内容都放在一个位置,通常位于文件的顶部。这是很好的编码习惯。

我相信评估ns声明C-x C-e不起作用的原因是SLIME工作方式的一部分。当你评估一个sexp时,SLIME在当前的命名空间中完成它。因此,评估(import 'java.io.File)会将文件导入到目前在ns中的任何名称空间。 (ns my.namespace(:import java.io.File)声明不会修改声明中指定的名称空间,但它不会更改值ns。 ns'my.namespace),您将看不到导入

2

(ns ...)表单是首选,因为您的代码将更容易读取,所有名称空间声明将收集在文件的顶部。编译器在Java等语言中强制执行,而且,包含的宏ns不需要引用符号,也可以使用引用,引用等。

我认为C-x C-e粘液快捷方式会将这段代码发送到连接的swank服务器,并进行评估。例如表格:

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

将创建一个名为my.test的新名称空间,其中包括contrib日志记录和java.io文件。它不会更改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) 

这样一来,当过我保存文件时,它被编译并通过自吹服务器加载,我在我正在使用的命名空间中使用repl进行实验。