阅读clojure API导入我看到:导入ns宏是首选导入,但是当我使用swank/slime/emacs编码时,我不能cx ce(ns ..)s表达式来得到代表进入repl,但使用(进口...)我可以。Clojure导入与导入
什么原因为什么:导入优于导入,并有快速的方法来从(.ns ...)s-expr从我的.clj文件导入到repl? (同样的问题可以概括为:使用和:引用..谢谢)
阅读clojure API导入我看到:导入ns宏是首选导入,但是当我使用swank/slime/emacs编码时,我不能cx ce(ns ..)s表达式来得到代表进入repl,但使用(进口...)我可以。Clojure导入与导入
什么原因为什么:导入优于导入,并有快速的方法来从(.ns ...)s-expr从我的.clj文件导入到repl? (同样的问题可以概括为:使用和:引用..谢谢)
这里是我的首选的工作流程:
现在你的煤泥REPL应该是在你工作的命名空间,你可以在上面添加到ns
声明,只是抄送CK为你改变的东西(包括你ns
进口)。
我不确定为什么cx ce不会工作,但只要命名空间已存在ns表达式上的Cc Cc确实工作正常。
:在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),您将看不到导入
(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进行实验。
你最后的要点对我来说有点不清楚。你正在打“','在你正在处理的文件中?难道这不就是插入一个逗号和'我'吗? – ftravers
当您的光标在Slime REPL缓冲区中时,在提示处输入其他内容之前,输入','。这将使文本“Command:”出现在迷你缓冲区中。现在立即输入'i',你会看到文本'Package:'出现在迷你缓冲区中。现在开始输入包的名称,根据需要使用tab-completion,直到您的名称空间的全名位于迷你缓冲区中。按下“ENTER”键,你的Slime REPL将会进入你的目标命名空间。 – semperos