从Clojure 1.3开始,我对在Clojure中构建内容所需的目录结构感到困惑。我正在使用蛋糕来制作蛋糕和蛋糕。
这是有效的。我有一个工作的构建目录addr_verify。主要和ns的名称是addr-verify。 project.clj将addr-verify称为main,在addr_verify / src中有addr_verify.clj。 addr_verify.clj中的ns指的是addr-verify名称空间。
现在,我有一个目录mr1,但是蛋糕不会在第1行编译它
(ns mr1
(use ['clojure.string :only '(split)])
(use ['clojure.string :only '(join)])
)
如果mr1是一个坏名称,我应该使用什么命名约定?
我已经尝试使用mr1-app作为主要名称和ns名称的mr1_app作为目录结构。我
对于mr1作为目录和ns名称,我得到
Caused by: clojure.lang.Compiler$CompilerException: java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to java.lang.Comparable, compiling:(mr1.clj:1)
我不知道我在这里做错了什么,而且我知道这可能非常简单。
为什么二进制mr1没有主?
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)))
)
)
答案 0 :(得分:3)
由于第一部分已经回答,我将回答关于:main
的部分。
正如sample.project.clj文件所说,:main
密钥应该具有包含-main
函数的命名空间作为赋值。所以你应该有这样的功能
(defn -main [& args]
(do-things-you-want-to-do-on-program-start))
你的mr1.clj中的。还有AFAIR如果你想把你的程序用作一个独立的jar,你必须将这个命名空间归类。我的意思是你必须:
在命名空间定义中包含:gen-class
选项,如下所示:
(ns mr1
(:gen-class)
...other options...)
使命名空间AOT编译(AOT代表Ahead Of Time)。为此,您需要在project.clj中的AOT编译的命名空间列表中指定您的命名空间:
(defproject mr1 "0.0.1-SNAPSHOT"
...other definitions...
:aot [mr1]
:main mr1)
完成此操作后,您可以使用cake
为您生成可执行jar。
ADD:
我认为值得注意的是,您根本不需要:main
。如果你想要做的只是在repl中运行你的程序,或者如果你想创建一个库,那么就没有gen-classes名称空间(除非你想以普通的java代码与java代码可以调用的方式进行交互)你的clojure代码)和没有:main
命名空间,只有可执行jar才需要。
答案 1 :(得分:1)
我认为命名空间声明的“语法”有问题。相反,试试这个:
(ns mr1
(:use [clojure.string :only [split]]
[clojure.string :only [join]]))
相应地改变你的:project.clj中的主要设置:它应该只是mr1
,与我之前所说的相反。
根据googolplex的评论编辑