2014-10-03 145 views
1

我剛開始學習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) 

回答

0

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

2

雖然可以運行使用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%)...)' - 也許你想'pos?'或'(補零?)'或'#(>%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