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

始终加载clojure库的最简单方法是什么?,clojure,Clojure,clojure新手提出的一个问题:如果我想从任何地方启动clojure REPL,例如,因为我只想计算一个指数,该怎么办?如何设置我的系统来执行此操作?(我已经删除了之前指向不完全答案的链接,因为它们把问题弄得一团糟。)下面@Jared314的答案链接的石榴文档帮助我看到我可以做到这一点: ~$ lein repl ... user=> (use '[cemerick.pomegranate :only (add-dependencies)]) nil user=> (add-dep

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
~$ 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=> 

现在,无论我在哪个子目录中,我如何在每次启动REPL时实现这一点

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

第二次主要编辑:

我发现,若我在不使用lein的情况下使用raw clojure,我可以在repl启动时执行命令。例如,如果文件
.clojurerc
包含文本
(打印“Yow!\n”)
,我可以执行以下操作:

~$ 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
~$ 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不是)。我不是想挑起争论。我只是感到沮丧。应该有一个简单的、众所周知的公式来做我想做的事情。)

当您需要外部依赖项时,您需要一个新项目、
lein new testproject1
、一个Leiningen profile
:依赖项或一些特定的IDE功能。(我知道至少LightTable允许在Instarepl中使用外部依赖项,所以我假设您可以在Emacs和CCW中使用。)

最好从创建一个新的测试项目开始,这样您就可以看到
项目.clj
布局。但是,如果您只想在repl中创建一个一次性库,请查看for石榴的
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

几个月后,当我看到这个问题时,我意识到我选择了一个不同的解决方案,但从未发布过。我现在在.clojurerc和.lein/project.clj中都留下了对
math.numeric tower
的引用,因为我在大多数Leiningen项目中都不需要它。当我想使用Clojure进行快速计算时,我会启动Clojure v在没有Leiningen的情况下使用shell脚本,以避免启动缓慢。这是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提供的那样好,但出于我的目的。

谢谢Jared314。直到您提供了指向石榴文档的非常有用的链接之前,我想我已经能够做您建议的所有事情了。我已经编辑了问题,以展示剩余的谜题。好的,这更有意义。我还没有完全理解您的原始问题。我已经在中更新了我的答案关于lein profiles配置的信息。谢谢Jared314。完美。现在我如何获得自动运行
(使用'clojure.math.numeric tower)
的效果,这样我就可以在启动repl后立即输入
(expt 23)
(使用'clojure.math.numeric tower)
在profile.clj中被忽略,即使使用
unquote
~
进行了各种实验,这似乎是由建议的。我已将配置更新为
使用init上的库。中的语法正确,但在profile.clj配置中的位置略有不同。我对clojure的信任已恢复:-),我可以看到,一旦我习惯了一些基本的lein voodoo,配置文件将非常有用(并且可能比它们所掩盖的Java voodoo更容易)。