访问莱宁根 REPL 中的库函数



对于库的开发,我从一个 lein 项目开始,调用如下:

lein new mylib

如果我现在调用lein install,我可以在其他项目中访问我的库。但是试图立即测试我编写的函数失败了:

lein repl
...
(dir mylib.core)
Exception No namespace: mylib.core found  clojure.core/the-ns (core.clj:4008)

我是否必须向project.clj文件添加一些内容?

为了使用库,您必须加载代码 - 它位于类路径上是不够的。

当然,您可以在文件中的ns声明中轻松执行此操作,但是在 repl 中,使用起来会更容易(require '[my-lib.whatever :as w])之后可以按预期调用(w/foo) (w/bar)等。您也可以使用 (in-ns 'my-lib.whatever) 来切换到命名空间,但这不会给您带来好的结果,除非您以前使用过 requireuseload-file 等来首先获取定义。

假设您创建了一个名为 clj-foo 的新库。

% lein new clj-foo

开始您的回复。

% cd clj-foo
% lein repl

在 repl 中,将主入口点加载到库并切换到其命名空间。

(load-file "src/clj_foo/core.clj")
(ns clj-foo.core)

现在你位于 clj-foo.core 命名空间中,请确保重新添加到 repl ns 中,以获取可用doc等内容。

(use 'clojure.repl)

就是这样。 你已准备好开始调用库中的函数。 请注意,如果其他库文件是通过 clj_foo/core.clj 顶部的命名空间声明加载的,则可从 clj-foo.core 命名空间获得这些文件。 如果没有,那么您还需要使用其路径调用load-file

如果在 core.clj 中进行更改。 您可以再次调用load-file来获取新代码。 随着您的进步,您可以使用苹果酒来促进单个函数和文件的加载。 但这是另一个问题。 :)

您需要添加依赖项才能使用其他项目中的库。为此,将一个向量(元组-2(添加到向量中,该向量是 project.clj 文件中:dependencies键的值。下面是一个示例:

:dependencies [[org.clojure/clojure "1.7.0"]
               [org.clojure/clojurescript "1.7.170"]
               [org.clojure/core.async "0.2.371"]
               [default-db-format "0.1.0-SNAPSHOT"]
               [com.andrewmcveigh/cljs-time "0.3.14"]]

我自己的本地图书馆叫做default-db-format。这真的与为com.andrewmcveigh/cljs-time添加依赖项没有什么不同。

正如您所说,您已经可以做到这一点,但是无法将 REPL 连接到库本身的项目。当你去(in-ns 'some-path)时,你需要在some-path前面加上单引号。请注意,某个路径与您的库名称不同。

与其使用lein repl不如使用 figwheel repl - 如果您的项目是使用 figwheel 设置的。我的库只有一个入口点,那就是lein figwheel devcards。在那之后,我去命名空间并尝试一个函数没有问题:

cljs.user=> (in-ns 'default-db-format.core)
nil
default-db-format.core=> (check 1 2)

正如 noisesmith 提到的,在 IDE 中使用 REPL 是最好的设置。无需繁琐的键入,只需单击按钮(或击键(即可调出预配置的 REPL(每个命名空间(。无花果/草书设置说明在这里。

我在以下配置中也面临同样的问题:

Leiningen 2.9.0 on Java 1.8.0_201 Java HotSpot(TM) 64-Bit Server VM

我的文件看起来像这样,从 repl 中我希望调用 foo 函数

 (ns cljtest.test
  (:gen-class))
(defn foo [input]
  (assoc {} "a" 123)) 

这两种方法对我来说都很好。

1(切换到相应的命名空间:

cljtest.core=> (in-ns 'cljtest.test)
#object[clojure.lang.Namespace 0x90175dd "cljtest.test"]
cljtest.test=> (foo nil)
{"a" 123}
cljtest.test=>

2(需要适当的命名空间:

cljtest.core=> (require '[cljtest.test :as test])
nil
cljtest.core=> (test/foo nil)
{"a" 123}
cljtest.core=>

相关内容

最新更新