我在Clojure开发期间在REPL中使用了许多有用的辅助函数。这包括一些内置函数,如doc
和pprint
,还包括我自己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
)。有没有一种简单的方法可以确保在开发期间有什么东西可用,无论我目前在哪个命名空间中运行?
答案 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-clojure
和in-ns
。