在开发期间在每个命名空间中使用clojure函数?

时间:2017-04-04 01:14:02

标签: clojure

我在Clojure开发期间在REPL中使用了许多有用的辅助函数。这包括一些内置函数,如docpprint,还包括我自己user.clj中的一些自定义函数。默认的clojure体验似乎是:

dev> (doc +)
;; works
dev> (in-ns 'project.core)
project.core> (doc +)
;; what is this "doc" thing you're talking about!?!?

这非常令人恼火(我知道我可以在这里引用clojure.repl/doc)。有没有一种简单的方法可以确保在开发期间有什么东西可用,无论我目前在哪个命名空间中运行?

4 个答案:

答案 0 :(得分:1)

一种选择是在:repl-options中为项目地图添加project.clj

(defproject myproj "1.0"
  :dependencies [[org.clojure/clojure "1.9.0-alpha15"]]
  :repl-options { :init-ns myproj.core
                  :init (require '[clojure.repl :refer :all]) })

...

$ lein repl
myproj.core=> (doc +)   ; works

答案 1 :(得分:0)

除非您使用boot或lein或其他形式将“神奇地”将此命名空间添加到REPL开发会话中,否则我恐怕您每次都必须手动使用它。

事情是名称空间有其避免名称冲突的良好作用。如果您有另一种方式告诉当前命名空间使用/需要另一个命名空间而不这样做,那么您将遇到很多其他问题。

如果你没有使用lein / boot,你可以just do as Alex Miller responded。对于从clojure.repl或其他一些ns API中获得所需内容的更受控制的方式,只需拥有require&您感兴趣的名称空间中的use声明,例如:

(ns 'project.core
   (:require [clojure.repl :refer [doc]]))

答案 2 :(得分:0)

正如Alex Gherega所提到的,自动且不加区分地将内容导入每个命名空间可能是一个坏主意。但是,您可以创建一个宏(或者可能是一个函数可以工作吗?),以便在需要时帮助导入与开发相关的命名空间。将其添加到您的user.clj。然后,如果您正在使用另一个命名空间并确定它有用,则可以运行(user/import-useful-dev-stuff)(或您决定调用它的任何内容)。

对于它的价值,我几乎在user命名空间内完成所有REPL会话,并且require我需要的所有命名空间。我使用Emacs,如果我需要更改另一个命名空间中的内容,我只需更改源代码,然后执行C-c C-k(启动一个苹果酒会话后)重新加载文件。如果您不使用Emacs,只需要通过require使用:reload选项从REPL重新加载一些工作。

答案 3 :(得分:-1)

如果您遇到这种情况,请执行以下操作:

(clojure.core/refer-clojure)

要求并加载clojure.core中的所有内容。

或者,如果存在project.core,则替代方法是:

(require 'project.core)
(in-ns 'project.core)

通过require加载命名空间将引用clojure.core。

如果project.core不存在,请执行:

(ns project.core)

ns宏将执行refer-clojurein-ns