首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure代码,修改:main

Clojure代码,修改:main
EN

Stack Overflow用户
提问于 2017-06-15 04:28:59
回答 1查看 80关注 0票数 0

我正在尝试运行以下代码

以下是我所采取的步骤:

代码语言:javascript
复制
$ lein new app latinsq

然后,我将project.clj修改如下:

代码语言:javascript
复制
    (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

代码语言:javascript
复制
(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")

我得到了以下错误:

代码语言:javascript
复制
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

从我所做的研究来看,这个问题是由名称on :main引起的。我已经对此做了几次修补,但我还是没能让它发挥作用。这是因为"latinsq“在目录树中显示的次数太多了吗?或者,我是不是误解了如何运行代码。

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

代码语言:javascript
复制
"Elapsed time: 0.468492 msecs"
"Elapsed time: 0.0796 msecs"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-15 06:33:27

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

顺便说一句。这是我获得的完整输出(使用由leiningen: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!生成的未经修改的-main )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44558569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档