如何从clojure/cider/nrepl中的兄弟文件导入内容?

如何从clojure/cider/nrepl中的兄弟文件导入内容?,clojure,classpath,cider,nrepl,Clojure,Classpath,Cider,Nrepl,我有一个关于~/src/proj/{foo,bar}.clj的小项目,我正在用emacs、cider和nREPL进行黑客攻击。在bar.clj中,我执行(def base-13-joke 42)并且我希望foo.clj中的代码引用bar.clj的base-13-joke。我该怎么做 我当前的类路径(使用~/src/proj=/jonas/src/mine/code/移动框) 我尝试了(添加类路径)file:///jonas/src/mine/code/move-the-box“以及(cider

我有一个关于
~/src/proj/{foo,bar}.clj
的小项目,我正在用emacs、cider和nREPL进行黑客攻击。在
bar.clj
中,我执行
(def base-13-joke 42)
并且我希望
foo.clj
中的代码引用
bar.clj
base-13-joke
。我该怎么做


我当前的类路径(使用
~/src/proj
=
/jonas/src/mine/code/移动框


我尝试了
(添加类路径)file:///jonas/src/mine/code/move-the-box“
以及
(cider.nrepl.middleware.util.java/add-classpath)!”file:///home/jonas/src/mine/code/move-the-box“”
这会引发
IllegalArgumentException数组元素类型不匹配java.lang.reflect.array.set(Array.java:-2)
。这是怎么回事?

如果您将多个Clojure源文件作为一个项目来使用,您将从使用诸如或之类的构建工具中获得很多好处。例如,下面介绍如何创建一个名为
myproject
的简单启动项目,其中包含多个源文件

首先,创建一个包含以下内容的
myproject
目录(无论在何处):

myproject
├── build.boot
└── src
    └── myproject
        ├── bar.clj
        └── foo.clj
Boot将先运行
build.Boot
文件,然后再执行其他操作(例如运行部分代码、创建JAR或启动REPL)。现在,您只需告诉Boot您的源文件将位于
src
目录中,所以只需将这一行添加到
build.Boot

(set-env! :source-paths #{"src"})
(require '[myproject.foo :as foo])
bar.clj
中,输入要从其他代码访问的定义:

(ns myproject.bar)

(def base-13-joke 42)
然后,在
foo.clj
中,您可以在
ns
声明中使用
:require
子句引用
bar.clj

(ns myproject.foo
  (:require [myproject.bar :as bar]))

(defn make-joke []
  (println (Long/toString bar/base-13-joke 13)))
这就是它的全部内容!当然,您可能希望实际使用您刚刚编写的代码执行某些操作。Boot通过任务处理“执行操作”。让我们编写一个只运行您项目中的一个函数的程序

当您想定义一个任务来使用Boot运行时,您可以通过将定义该任务的代码添加到
build.Boot
文件中来实现。不过,首先,因为我们将调用一些主代码(在本例中,
myproject.foo
命名空间中的
make joke
函数),我们需要
要求
该代码。将此行添加到
build.boot

(set-env! :source-paths #{"src"})
(require '[myproject.foo :as foo])
现在我们可以定义一个简单的
run
任务(同样,在
build.boot
中)来运行我们的函数:

(deftask run []
  (with-pass-thru _
    (foo/make-joke)))
带pass-thru的
业务只与Boot中任务的一些细节有关,您可以详细阅读这些细节

执行任务非常简单。从项目根目录在命令行中运行此命令:

$ boot run
33
Boot还附带一些内置任务。例如,如果您运行
Boot repl
,您将在
Boot.user
命名空间中看到熟悉的repl提示:

boot.user=>
此命名空间与Boot执行
build.Boot
脚本的命名空间相同,因此,由于我们在
build.Boot
中有
require
用于
myproject.foo
,因此我们可以在REPL中使用该命名空间:

boot.user=> (foo/make-joke)
33
nil
当然,您也可以
要求
其他名称空间:

boot.user=> (require '[myproject.bar :as bar])
nil
boot.user=> bar/base-13-joke
42
你可以用Boot做更多的事情,比如重新加载代码和与苹果酒交互,你可以在