2017-06-15 80 views
0

我試圖運行以下codeClojure代碼,修補:主

下面是我所採取的步驟:

$ lein new app latinsq 

我再修改project.clj如下:

(defproject latinsq "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.8.0"]] 
    :main latinsq.core 
    :target-path "target/%s" 
    :profiles {:uberjar {:aot :all}}) 

和/latinsq/src/latinsq/core.clj

(ns latinsq.core 
    (:use [clojure.set :only (difference)])) 


(defn replace-at 
    "in string s, replaces character at index p with c" 
    [s p c] 
    (str 
    (.substring s 0 p) 
    c 
    (.substring s (inc p)))) 

; memoized function to save time on sqrt calls 
(def sqrt (memoize (fn [x] (Math/sqrt x)))) 


(defn candidates 
    "assuming that the position pos is empty in sq, return those values that it might be" 
    [pos sq] 

    (let [sq-size (int (sqrt (count sq)))] 

        ; set difference between... 
    (difference 
        ; ...all the possible values... 
    (set (map #(first (str %)) (range 1 (inc sq-size)))) 

        ; ...and the set of... 
    (into #{} 
     (concat 
        ; ...those in the same column... 
     (map #(get sq %) 
     (range (rem pos sq-size) 
      (count sq) 
      sq-size)) 
        ; ...and those in the same row. 
     (map #(get sq %) 
     (map #(+ % (- pos (rem pos sq-size))) 
       (range 0 sq-size)))))))) 




(defn latinsq 
    "encode your partial-square as a string like 1--1 
    this fn returns a lazy sequence of all solutions" 
    [sq] 
        ; Find the first empty square 
    (let [empty-pos (.indexOf sq "-")] 

        ; if none, we don't need to do anything 
    (if (= -1 empty-pos) 
     (list sq) 

        ; else make a lazy sequence of... 
     (lazy-seq 
        ; ...the concatenation of all the results of... 
     (apply concat 
        ; ...using "map" to recurse, filling in the empty 
        ; square with... 
      (map #(latinsq (replace-at sq empty-pos %)) 

        ; ...each possible value in turn 
      (candidates empty-pos sq))))))) 




;; So, now some examples 

(time 
(latinsq "123------")) 
;; "Elapsed time: 0.045368 msecs" 
;; ("123231312" "123312231") 

(time 
(latinsq "12---31--------4")) 
;; "Elapsed time: 0.068511 msecs" 
;; ("1243431224313124" "1243431234212134") 


;; A bit harder, an empty 5x5 grid 
;; has 161280 solutions according to 
;; http://mathworld.wolfram.com/LatinSquare.html 
(time 
(count (latinsq "-------------------------"))) 
;; "Elapsed time: 36980.759177 msecs" <--- a bit slow 
;; 161280 


;; Having made sure that our function returns a lazy seq 
;; the whole result can be treated lazily, so to find just one 
;; solution to the 5x5 grid: 
(time 
(first (latinsq "-------------------------"))) 
;; "Elapsed time: 0.985559 msecs"  <--- not slow 
;; "1234521453345124523153124" 

;; first 3 of 5524751496156892842531225600 solutions for a 9x9 grid 
(time 
(take 3 (latinsq "---------------------------------------------------------------------------------"))) 
;; "Elapsed time: 0.075874 msecs" 
;; ("123456789214365897341278956432189675567891234658917342789523461896742513975634128" 
;; "123456789214365897341278956432189675567891234658917342789523461975634128896742513" 
;; "123456789214365897341278956432189675567891234658917342789524163896743521975632418") 

我收到以下錯誤:

Exception in thread "main" java.lang.Exception: Cannot find anything to run for: latinsq.core, compiling:(/tmp/form-init4810859530587029884.clj:1:73) 
     at clojure.lang.Compiler.load(Compiler.java:7391) 
     at clojure.lang.Compiler.loadFile(Compiler.java:7317) 
     at clojure.main$load_script.invokeStatic(main.clj:275) 
     at clojure.main$init_opt.invokeStatic(main.clj:277) 
     at clojure.main$init_opt.invoke(main.clj:277) 
     at clojure.main$initialize.invokeStatic(main.clj:308) 
     at clojure.main$null_opt.invokeStatic(main.clj:342) 
     at clojure.main$null_opt.invoke(main.clj:339) 
     at clojure.main$main.invokeStatic(main.clj:421) 
     at clojure.main$main.doInvoke(main.clj:384) 
     at clojure.lang.RestFn.invoke(RestFn.java:421) 
     at clojure.lang.Var.invoke(Var.java:383) 
     at clojure.lang.AFn.applyToHelper(AFn.java:156) 
     at clojure.lang.Var.applyTo(Var.java:700) 
     at clojure.main.main(main.java:37) 
Caused by: java.lang.Exception: Cannot find anything to run for: latinsq.core 
     at user$eval5.invokeStatic(form-init4810859530587029884.clj:1) 
     at user$eval5.invoke(form-init4810859530587029884.clj:1) 
     at clojure.lang.Compiler.eval(Compiler.java:6927) 
     at clojure.lang.Compiler.eval(Compiler.java:6917) 
     at clojure.lang.Compiler.load(Compiler.java:7379) 
     ... 14 more 

從我所做的研究來看,這個問題是由main:上的名稱引起的。這幾次我已經修好了,我一直沒有能夠得到這個工作。這是因爲「latinsq」在目錄樹中顯示過多次嗎?或者,我誤解了如何運行代碼。

或者,當我終於得到它的運行,唯一的輸出是:

"Elapsed time: 0.468492 msecs" 
"Elapsed time: 0.0796 msecs" 

回答

1

你忘了定義-main功能 - 這一次是由核心命名空間leiningen自動生成。 您也未指定如何嘗試運行該應用程序,但我認爲您只需調用lein run。 只要您將-main函數添加到您的名稱空間,它應該可以工作。 我還建議將latinsq函數調用包裝到另一個函數中,以避免在加載名稱空間時評估它們。

Btw。這是我得到的全部輸出(使用leiningen生成的未修改的-main lein run "Elapsed time: 0.183692 msecs" "Elapsed time: 0.055872 msecs" "Elapsed time: 68742.261628 msecs" "Elapsed time: 1.361745 msecs" "Elapsed time: 0.045366 msecs" Hello, World!

+0

這使我想到了兩個問題:第一,我如何/在哪裏使用-main?我將它放置在各個位置第二,不應該有某種類型的字符串輸出嗎?字符串輸出是我最感興趣的東西 – emka

+0

我也只是使用lein run。 – emka

+0

@emka 1. As我說過,'-main'函數是在'core'命名空間自動生成的,它看起來像這樣:https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L205 2。我不確定你的意思是「字符串輸出」,但是如果你想用逗號輸出nd行你只需要寫入標準輸出(大概用'println'函數) –