如何从终端运行clojure程序

问题描述:

我刚开始学习clojure,并使用Textmate编辑器编写脚本。但是,我无法弄清楚如何从终端运行它。就像我输入clj filename.clj命令,但没有任何反应。我是否还需要在某处添加函数名称,因为我有一个将数字作为参数的函数。如何从终端运行clojure程序

这里是我的代码,我想从终端中运行:

(defn next-collatz-num [n] 


(if (even? n) 
    (quot n 2) 
    (inc (* n 3)))) 

(defn collatz [n] 
    (take-while #(< 1 %)(iterate next-collatz-num n))) 

(defn max-count-collatz [n] 
    (when (> n 0) 
    (first 
     (reduce 
     #(if (> (last %1)(last %2)) %1 %2) 
      [1 1] (map #(list % (count (collatz %))) (range 1 (inc n))))))) 

(max-count-collatz 999999) 

Clojure的已经不仅仅是在终端命令提示符下运行的整个脚本一个更加互动的环境。

TL; DR,安装leiningen,创建一个project.clj,然后运行lean repl

如果您不希望创建一个project.clj,或者如果你很好奇如何做到这一点的硬盘的方式,阅读...

可以启动的Clojure读-EVAL-打印环(REPL)交互提示与

java -cp clojure-1.6.0.jar clojure.main 

(下载最新的Clojure罐子here)。

一旦你在REPL是,加载代码文件:

(load-file "my-script.clj") 

现在,你可以直接调用该函数:

(max-count-collatz 5) 

如果它不能如你的工作预计,更改代码,并保存在REPL重新加载:

(require 'my-script :reload-all) 
+0

我不明白声明“一旦你在REPL”。怎么样? – 2014-10-03 02:30:30

+0

@EricaMaine,在终端上使用第一行('java -cp clojure-1.6.0.jar clojure.main')启动Clojure REPL。 – 2014-10-03 02:33:24

+0

线程“main”中的异常java.lang.NoClassDefFoundError:clojure/main 这是我使用该行时得到的结果。 – 2014-10-03 02:36:06

虽然可以运行使用Clojure的个人文件的Clojure .jar,关于Clojure的最好的东西之一是leiningen依赖管理器和构建工具。创建一个项目很简单,对于没有外部依赖项的单个文件而言,这是一个比直接使用java和Clojure.jar更大的改进。

+0

嗨,在我的代码中,当我输入(collat​​z 7)时,结果是(7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2),但是它实际上应该是(7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1)。为什么它最后错过了1? – 2014-10-07 12:42:28

+0

那是因为你调用了'(take-while#(%1)' – noisesmith 2014-10-07 14:27:09

+0

嗨,我试图在我的clojure代码中使用ns来处理命名空间。所以,我在Downloads目录中有我的jar文件,我在Downloads目录下创建了一个文件夹“poker”。在“扑克文件夹里面,我创建了两个互相依赖的clojure文件,所以我也把我的jar文件放在扑克文件夹中。现在,当我这样做时: java -cp clojure-1.6.0.jar clojure.main 它给了我“权限被拒绝”,为什么? – 2014-10-12 09:38:07