加载clojure库的最简单方法是什么?

时间:2013-09-16 18:27:17

标签: clojure

来自一个彻头彻尾的新人的问题:如果我想从任何地方开始一个clojure REPL怎么办,例如因为我只是想计算一个指数?如何设置我的系统来执行此操作? (我之前删除了不完整答案的链接,因为它们使问题变得混乱。)@ Jared314下面的答案链接的石榴文档帮助我看到我可以这样做:

~$ 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的原始clojure,我可以在repl启动时执行命令。例如,如果文件.clojurerc包含文本(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不是)。我不是在尝试煽动争论。我只是沮丧。应该有一个简单的,众所周知的公式来做我想做的事情。)

2 个答案:

答案 0 :(得分:9)

当您需要外部依赖项时,您需要新项目lein new testproject1lein-oneoff pluginPomegranate,Leiningen个人资料:dependencies条目或某些特定的IDE功能。 (我知道至少LightTable允许在他们的Instarepl中使用外部依赖项,所以我假设您可以在Emacs和CCW中执行此操作。)

最好从创建新的测试项目开始,这样您就可以看到project.clj布局。但是,如果您只想在repl中使用一次性库,请查看instructions for Pomegranate add-classpath命令。默认情况下,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

答案 1 :(得分: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为我的目的提供。