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

时间:2016-04-16 15:22:29

标签: clojure classpath cider nrepl

我有一个function startButton_Callback(~, ~, handles) h = animatedline; %// Store the handle within the appdata of the figure setappdata(gcbf, 'MyAnimatedLine', h) la = newClass; addlistener(la,'statusAnnouncement',@StatusListener); end function StatusListener(obj, evnt) %// Get the handle from the appdata of the figure h = getappdata(gcbf, 'MyAnimatedLine'); h.addpoints(evnt.coordinate(1), evnt.coordinate(2)) end 的小项目,我正在攻击emacs,cider和nREPL。在~/src/proj/{foo,bar}.clj我做bar.clj,我希望(def base-13-joke 42)中的代码引用foo.clj的{​​{1}}。我该怎么做?

我当前的类路径(bar.clj = base-13-joke

~/src/proj

我尝试/jonas/src/mine/code/move-the-box似乎没有效果,以及/home/jonas/src/mine/code/move-the-box/target/classes /home/jonas/.m2/repository/cider/cider-nrepl/0.11.0/cider-nrepl-0.11.0.jar /home/jonas/.m2/repository/org/tcrawley/dynapath/0.2.3/dynapath-0.2.3.jar /home/jonas/.m2/repository/org/clojure/tools.nrepl/0.2.12/tools.nrepl-0.2.12.jar /home/jonas/.m2/repository/clojure-complete/clojure-complete/0.2.4/clojure-complete-0.2.4.jar /home/jonas/.m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar /usr/lib/jvm/java-7-openjdk-amd64/lib/tools.jar 抛出(add-classpath "file:///jonas/src/mine/code/move-the-box")。那里发生了什么?

1 个答案:

答案 0 :(得分:4)

如果您将多个Clojure源文件作为单个项目使用,那么使用LeiningenBoot等构建工具可以获得很多好处。例如,以下是如何使用多个源文件创建名为myproject的简单Boot项目。

首先,使用以下内容创建一个myproject目录(无论在哪里):

myproject
├── build.boot
└── src
    └── myproject
        ├── bar.clj
        └── foo.clj

引导将在它执行任何其他操作之前运行您的build.boot文件(例如,运行您的一些代码,创建JAR或启动REPL)。现在,您只需告诉Boot,您的源文件将位于src目录中,因此只需将此行添加到build.boot

(set-env! :source-paths #{"src"})

bar.clj中,从其他代码中输入您要访问的定义:

(ns myproject.bar)

(def base-13-joke 42)

然后,在foo.clj中,您可以使用bar.clj声明中的:require条款引用ns

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

(defn make-joke []
  (println (Long/toString bar/base-13-joke 13)))

这就是它的全部!当然,你可能想要用你刚才编写的代码实际。引导通过任务处理“服务”。让我们编写一个只运行项目中的一个函数的文件。

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

(require '[myproject.foo :as foo])

现在我们可以定义一个简单的run任务(同样,在build.boot中)将运行我们的函数:

(deftask run []
  (with-pass-thru _
    (foo/make-joke)))

with-pass-thru业务只与Boot中的一些具体任务有关,您可以详细了解here

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

$ boot run
33

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

boot.user=>

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

boot.user=> (foo/make-joke)
33
nil

当然,您也可以require其他名称空间:

boot.user=> (require '[myproject.bar :as bar])
nil
boot.user=> bar/base-13-joke
42

您可以使用Boot执行更多操作,例如重新加载代码并与CIDER交互,您可以在Boot Wiki中阅读所有内容。