5

阅读用于导入的 clojure API,我看到 ns 宏中的 :import 优先于导入,但是当我使用 swank/slime/emacs 进行编码时,我无法使用 (ns ..) s-expression 来获取deps 进入 repl,但使用 (import ...) 我可以。

为什么 :import 优于 import 的原因是什么,是否有快速的方法将 deps 从我的 .clj 文件中的 (ns ...) s-expr 导入到 repl?(同样的问题可以概括为 :use 和 :refer .. 谢谢)

4

4 回答 4

5

这是我首选的工作流程:

  • 开始斯旺克/史莱姆
  • 在 Emacs 中打开我要处理的文件
  • C-c C-k编译和加载有问题的文件
  • ,后跟,然后键入您i正在处理的命名空间的名称并按Enter

现在你的 Slime REPL 应该在你正在处理的命名空间中,你可以添加到ns顶部的声明中,就像C-c C-k你改变东西(包括你的ns导入)一样。

于 2011-07-18T12:30:44.823 回答
2

我不确定为什么 cx ce 不起作用,但是只要命名空间已经存在,ns 表达式上的 Cc Cc 就可以正常工作。

于 2011-07-13T07:54:54.163 回答
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从您正在编辑的文件中按下,系统将提示您切换到该文件的名称空间(除非您已经在该名称空间中)。按回车键选择。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 在我正在处理的命名空间中进行实验。

于 2011-07-20T11:42:53.310 回答
1

ns 声明中的 :import 是首选,因为它将与命名空间有关的所有内容都保存在一个地方,通常在文件的顶部。这是很好的编码习惯。

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

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

于 2011-07-19T17:41:40.953 回答