确定Clojure REPL(加载文件)和蛋糕构建产生错误的原因
自从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 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行编译它 (
(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...)
(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...)
(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
真的不应该是必需的