读取clojure API以进行导入我看到:ns宏中的import最好导入,但是当我使用swank / slime / emacs进行编码时,我不能cx ce(ns ..)s-表达式让deps进入repl,但是使用(import ...)我可以。
原因是什么:导入比导入更受欢迎,是否有快速方法将(ns ...)s-expr中的deps从我的.clj文件导入到repl? (同样的问题可以概括为:使用和:参考..谢谢)
答案 0 :(得分:5)
以下是我首选的工作流程:
现在你的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
目前的任何名称空间中。
ns
的值。除非您更改为该命名空间(在-ns'my.namespace中),您将看不到导入