6

一个完全是 clojure 新手的问题:如果我希望能够从任何地方启动 clojure REPL,例如因为我只想计算一个指数,该怎么办?如何设置我的系统来执行此操作?(我已经删除了之前指向不完全答案的链接,因为它们把问题弄得乱七八糟。)下面@Jared314 的答案链接的 Pomegranate 文档帮助我看到我可以做到这一点:

~$ lein repl
...
user=> (use '[cemerick.pomegranate :only (add-dependencies)])
nil
user=> (add-dependencies :coordinates '[[org.clojure/math.numeric-tower "0.0.2"]])
{[org.clojure/clojure "1.3.0"] nil, [org.clojure/math.numeric-tower "0.0.2"] #{[org.clojure/clojure "1.3.0"]}}
user=> (use 'clojure.math.numeric-tower)
nil
user=> (expt 2 3)
8

耶!

现在,无论我在哪个子目录中,每次启动 REPL 时,我如何才能做到这一点?

我想我只是对基本的clojure设置一无所知。对于那个很抱歉。

第二次重大修改:

我发现如果我在没有 lein 的情况下使用 raw clojure,我可以在 repl 启动时执行命令。例如,如果文件.clojurerc包含 text (print "Yow!\n"),我可以这样做:

~$ java -cp /usr/local/lib/clojure-1.5.1/clojure-1.5.1.jar clojure.main -i .clojurerc -r
Clojure 1.5.1
Yow!
user=> 

我可以做这样的事情lein吗?或者更好的是,在 clojure 中自动加载 clojure.math.numeric-tower 而不使用 lein(因为对于简单的命令行实验,lein 的启动比直接启动 clojure 慢)。

(看起来好像我不是想自己解决这个问题,但事实并非如此。我一直在进行网络搜索和实验,但我一直在碰壁。我开始觉得 clojure 是适用于成熟的编程项目。我曾认为它可能对临时实验和计算有好处(就像 lisps 传统上那样,但 Java 不是)。我不是试图煽动争论。我只是感到沮丧。应该有一个简单的、众所周知的公式来做我想做的事情。)

4

2 回答 2

9

当您需要外部依赖项时,您将需要一个新项目、lein new testproject1lein -oneoff 插件Pomegranate、Leiningen 配置文件:dependencies条目或某些特定的 IDE 功能。(我知道至少 LightTable 在他们的 Instarepl 中允许外部依赖,所以我假设你可以在 Emacs 和 CCW 中做到这一点。)

最好从创建一个新的测试项目开始,这样您就可以看到project.clj布局。但是,如果您只想要一个 repl 中的一次性库,请查看Pomegranate命令的说明。add-classpathPomegranate 默认可以在 中访问lein repl,因此他们的示例应该可以在没有任何额外内容的情况下工作。

编辑:

从您更新的问题来看,听起来您想要一个持久的 repl 依赖项。您可以在配置文件下添加[org.clojure/math.numeric-tower "0.0.2"]到配置文件中。~/.lein/profiles.clj:repl

{:user {}
 :repl {:dependencies [[org.clojure/math.numeric-tower "0.0.2"]]
        :repl-options {:init (use 'clojure.math.numeric-tower)}}}

然后当你运行lein repl

(expt 2 3) ;=> 8
于 2013-09-16T18:44:21.983 回答
0

几个月后看了这个问题,我意识到我选择了一个不同的解决方案,但从未发布过。我现在离开math.numeric-tower.clojurerc 和 .lein/project.clj 的引用,因为大多数 Leiningen 项目都不需要它。而当我想使用 Clojure 进行快速计算时,我会通过没有 Leiningen 的 shell 脚本启动 Clojure,以避免启动缓慢。这是 shell 脚本中的内容:

#!/bin/sh

jars=/usr/local/lib/clojure-1.5.1/clojure-1.5.1.jar:/usr/local/lib/clojure-1.5.1/math.numeric-tower-0.0.2.jar

while [ "$1" != "${1%.jar}" ]; do  # while param is a jar file
    jars="$jars:$1"
    shift
done
jars="$jars:."

exec rlwrap java -cp "$jars" clojure.main -e "(use 'clojure.math.numeric-tower)" "$@" -r

中间部分允许您在命令行中添加 jar,但在实践中我觉得这没什么用,因为我将 Leiningen 用于正在进行的项目。不过,其他人可能会发现脚本的那部分很有用。rlwrap 是一个实用程序,可为您提供命令行历史记录,尽管就我的目的而言,它不如 Leiningen 提供的那么好。

于 2014-01-23T14:28:21.610 回答