确定Clojure REPL(加载文件)和蛋糕构建产生错误的原因

确定Clojure REPL(加载文件)和蛋糕构建产生错误的原因,clojure,Clojure,自从Clojure 1.3以来,我对在Clojure中构建某些东西所需的目录结构感到困惑。我用蛋糕来建造和复制蛋糕 以下是有效的方法。我有一个工作的构建目录addr\u verify。main和ns的名称是addr verify。project.clj将addr verify称为main,在addr\u verify/src中有addr\u verify.clj。addr_verify.clj中的ns指的是addr verify名称空间 现在,我有一个目录mr1,但cake不会在第1行编译它 (

自从Clojure 1.3以来,我对在Clojure中构建某些东西所需的目录结构感到困惑。我用蛋糕来建造和复制蛋糕

以下是有效的方法。我有一个工作的构建目录addr\u verify。main和ns的名称是addr verify。project.clj将addr verify称为main,在addr\u verify/src中有addr\u verify.clj。addr_verify.clj中的ns指的是addr verify名称空间

现在,我有一个目录mr1,但cake不会在第1行编译它

(ns mr1
  (use ['clojure.string :only '(split)])
  (use ['clojure.string :only '(join)])
  )
如果mr1是一个坏名字,我应该使用什么命名约定

我已经尝试将mr1_应用程序作为目录结构,使用mr1应用程序作为主名称和ns名称。我

对于作为目录和ns名称的mr1,我得到

Caused by: clojure.lang.Compiler$CompilerException: java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to java.lang.Comparable, compiling:(mr1.clj:1)
我只是不明白我做错了什么,我知道这可能是非常简单的事情

编辑: 为什么二进制mr1没有main

mr1/project.clj

(defproject mr1 "0.0.1-SNAPSHOT"
  :description "TODO: add summary of your project"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [org.clojure/tools.cli "0.1.0"]]
   :main mr1)
mr1/src/mr1.clj

(ns mr1
    (:use [clojure.string :only [split]]
          [clojure.string :only [join]]))

(def grid-dim (atom '(0 0)))
(def mr1-pos (atom '(0 0)))
(def mr2-pos (atom '(0 0)))

(defn cvt-str-to-int
    [string]
   (map #(Integer/parseInt %)
    (split string #" ")))

(defn prompt-for-grid-dim
    []
    (do
        (println "Enter the dimensions of the grid (10 10) ")
        (cvt-str-to-int (read-line))
    ))

(defn prompt-for-rover-pos
    [rover-num]
    (do
        (println "Enter rover's initial position on the grid (2 4) ")
        (cvt-str-to-int (read-line))
    ))

(defn prompt-for-rover-moves
    []
    (do
        (println "Enter rover's moves LMMRM ")
        (read-line)
    ))

(defn -main 
    [& args]
    (do
       (reset! grid-dim (cvt-str-to-int (prompt-for-grid-dim)))
       (reset! mr1-pos (cvt-str-to-int (prompt-for-rover-pos)))
    ) 
)

我认为名称空间声明的“语法”有问题。相反,请尝试以下方法:

(ns mr1
    (:use [clojure.string :only [split]]
          [clojure.string :only [join]]))
相应地更改project.clj中的:main设置:它应该是
mr1
,与我前面所说的相反


根据googolplex的评论编辑,我认为您的名称空间声明的“语法”有问题。相反,请尝试以下方法:

(ns mr1
    (:use [clojure.string :only [split]]
          [clojure.string :only [join]]))
相应地更改project.clj中的:main设置:它应该是
mr1
,与我前面所说的相反


根据googolplex的评论编辑

由于第一部分已经回答,我将回答关于
:main
的部分。 正如文件所说,
:main
键应该有一个包含
-main
函数的名称空间作为赋值。所以你应该有这样的功能

(defn -main [& args]
  (do-things-you-want-to-do-on-program-start))
在您的mr1.clj中。另外,如果你想把你的程序作为一个独立的jar使用,你必须对这个名称空间进行分类。我的意思是,你必须:

  • 在命名空间定义中包括
    :gen class
    选项,如下所示:

    (ns mr1
      (:gen-class)
      ...other options...)
    
  • 编译名称空间AOT(AOT代表提前)。为此,您需要在project.clj中的AOT编译名称空间列表中指定您的名称空间:

    (defproject mr1 "0.0.1-SNAPSHOT"
      ...other definitions...
      :aot [mr1]
      :main mr1)
    
  • 完成此操作后,可以使用
    cake
    为您生成可执行jar

    加:
    我认为值得注意的是,您根本不需要有
    :main
    。如果您只想在repl中运行程序,或者想创建一个库,那么就不能有gen类名称空间(除非您想以java代码可以调用clojure代码的方式与普通java代码交互),也不能有
    :main
    名称空间,只有可执行JAR才需要它。

    由于第一部分已经回答,我将回答关于
    :main
    的部分。 正如文件所说,
    :main
    键应该有一个包含
    -main
    函数的名称空间作为赋值。所以你应该有这样的功能

    (defn -main [& args]
      (do-things-you-want-to-do-on-program-start))
    
    在您的mr1.clj中。另外,如果你想把你的程序作为一个独立的jar使用,你必须对这个名称空间进行分类。我的意思是,你必须:

  • 在命名空间定义中包括
    :gen class
    选项,如下所示:

    (ns mr1
      (:gen-class)
      ...other options...)
    
  • 编译名称空间AOT(AOT代表提前)。为此,您需要在project.clj中的AOT编译名称空间列表中指定您的名称空间:

    (defproject mr1 "0.0.1-SNAPSHOT"
      ...other definitions...
      :aot [mr1]
      :main mr1)
    
  • 完成此操作后,可以使用
    cake
    为您生成可执行jar

    加:

    我认为值得注意的是,您根本不需要有
    :main
    。如果您只想在repl中运行程序,或者想创建一个库,那么就不能有gen类名称空间(除非您想以java代码可以调用clojure代码的方式与普通java代码交互),也不能有
    :main
    名称空间,只有可执行JAR才需要。您的回答解决了加载到repl的问题。但现在,当我试图建立,我得到了一个垃圾箱,但没有主。我要去编辑原始问题并发布所有源代码。你在project.clj中有一个:main设置吗?我想你的:main应该是:mr1.mr1,所以:projectname dot namespacename我很感激你得到了它,这样我可以在repl中构建。我看到项目目录被称为mr而不是mr1,我不知道这是否是错误的原因。您的回答解决了加载到repl的问题。但现在,当我试图建立,我得到了一个垃圾箱,但没有主。我要去编辑原始问题并发布所有源代码。你在project.clj中有一个:main设置吗?我想你的:main应该是:mr1.mr1,所以:projectname dot namespacename我很感激你得到了它,这样我可以在repl中构建。我看到项目目录被称为mr而不是mr1,我不知道这是否是这个bug的原因。他有一个-main函数,但你必须滚动它才能看到(至少我必须这样做)。我不知道“lein bin”是否与cake的工作方式完全相同,但在1.3中,如果是这样的话,你不应该执行:gen class或:aot。不过不确定!是的,我错过了
    -main
    函数:)1.3意味着clojure-1.3.0?在这种情况下,恐怕你错了。考虑这一点:(Test.CLJ应该在实际项目中的SRC)。如果您从test.clj中删除
    :gen class
    ,或从project.clj中删除
    :aot
    ,并执行
    lein uberjar
    ,您将得到一个无法启动的jar。lein bin依赖于uberjar,因此它确实需要
    :gen class
    :aot
    。我不认为蛋糕有什么不同,所以不需要它,因为这是clojure的一般工作方式。如果你想从名称空间中获取一个类,你只需要AOT编译名称空间。嗯,也许蛋糕生成的二进制文件可以直接作为脚本启动名称空间?在这种情况下,
    :gen class
    真的不应该是必需的