【问题标题】:Clojure import versus :importClojure 导入与 :import
【发布时间】:2011-07-13 01:32:07
【问题描述】:

阅读用于导入的 clojure API 我发现 ns 宏中的 :import 比导入更可取,但是当我使用 swank/slime/emacs 进行编码时,我无法 c-x c-e (ns ..) s-表达式让 deps 进入 repl,但使用 (import ...) 我可以。

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

【问题讨论】:

    标签: emacs clojure slime


    【解决方案1】:

    这是我首选的工作流程:

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

    现在你的 Slime REPL 应该在你正在处理的命名空间中,你可以添加到顶部的 ns 声明,只需 C-c C-k 更改内容(包括你的 @ 987654322@ 进口)。

    【讨论】:

    • 你的最后一个要点对我来说有点不清楚。您是否在正在处理的文件中点击“,”?那不是简单地插入一个逗号和一个'i'吗?
    • 当您的光标位于 Slime REPL 缓冲区中时,在提示符处输入任何其他内容之前,请输入 ,。这将使文本Command: 出现在迷你缓冲区中。现在立即输入i,您会看到文本Package: 出现在迷你缓冲区中。现在开始输入你的包名,根据需要使用制表符补全,直到你的命名空间的全名在迷你缓冲区中。按ENTER,您的 Slime REPL 现在将位于您的目标命名空间中。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我认为C-x C-e slime 快捷方式会将这段代码发送到连接的 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。现在,您应该看到 my.test=> 而不是 user=> 提示符,表明您在该命名空间中。

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

      (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 在我正在处理的命名空间中进行实验。

      【讨论】:

        【解决方案4】:
        ns 声明中的

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-23
          • 2021-12-19
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 2011-04-23
          • 2014-04-19
          • 2012-04-25
          相关资源
          最近更新 更多