来自一个彻头彻尾的新人的问题:如果我想从任何地方开始一个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不是)。我不是在尝试煽动争论。我只是沮丧。应该有一个简单的,众所周知的公式来做我想做的事情。)
答案 0 :(得分:9)
当您需要外部依赖项时,您需要新项目lein new testproject1
,lein-oneoff plugin,Pomegranate,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为我的目的提供。