Clojure代码,修补:主要

时间:2017-06-15 04:29:00

标签: clojure

我正在尝试运行以下code

以下是我采取的步骤:

foreach() {} pluginsDir.cdUp(); 

然后我按如下方式修改了project.clj:

$ lein new app latinsq

和/latinsq/src/latinsq/core.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}})

我收到以下错误:

(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")

从我所做的研究中,问题是由名称on:main引起的。我已经修改了几次,但是我无法让它工作。这是因为“latinsq”在目录树中出现的次数太多了吗?或者,我是否误解了如何运行代码。

或者,当我最终运行它时,唯一的输出是:

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

1 个答案:

答案 0 :(得分:1)

您忘了定义-main函数 - 这个函数由leiningen在核心命名空间中自动生成。 您也没有指定尝试运行应用程序的方式,但我假设您只是调用lein run。 只要您将-main函数添加到命名空间,它就可以工作。 我还建议将latinsq函数调用包装到另一个函数中,以避免在加载名称空间时对它们进行评估。

顺便说一下。这是我得到的完整输出(使用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!