确定为什么Clojure REPL(加载文件)和蛋糕构建产量错误

时间:2011-12-11 15:31:26

标签: clojure

从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)))
    ) 
)

2 个答案:

答案 0 :(得分:3)

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

(defn -main [& args]
  (do-things-you-want-to-do-on-program-start))
你的mr1.clj中的

。还有AFAIR如果你想把你的程序用作一个独立的jar,你必须将这个命名空间归类。我的意思是你必须:

  1. 在命名空间定义中包含:gen-class选项,如下所示:

    (ns mr1
      (:gen-class)
      ...other options...)
    
  2. 使命名空间AOT编译(AOT代表Ahead Of Time)。为此,您需要在project.clj中的AOT编译的命名空间列表中指定您的命名空间:

    (defproject mr1 "0.0.1-SNAPSHOT"
      ...other definitions...
      :aot [mr1]
      :main mr1)
    
  3. 完成此操作后,您可以使用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的评论编辑