Определение причины, по которой Clojure REPL (загрузочный файл) и ошибка сборки торта - PullRequest
1 голос
/ 11 декабря 2011

Начиная с Clojure 1.3, я запутался в структуре каталогов, необходимой для создания чего-либо в Clojure.Я использую торт, чтобы построить и торт Repl.

Вот что работает.У меня есть рабочий каталог сборки addr_verify.Имя main и ns - addr-verify.Project.clj ссылается на addr-verify как на основное, а в addr_verify / src есть addr_verify.clj.Ns внутри addr_verify.clj относится к пространству имен addr-verify.

Итак, у меня был каталог mr1, но торт не скомпилирует его прямо в строке 1

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

Если mr1 - это плохое имя, какое соглашение об именах мне следует использовать?

Я пробовал mr1_app как структуру каталогов, используя mr1-app в качестве основного имени и имени ns.I

Для 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 ]

3 голосов
/ 12 декабря 2011

Поскольку на первую часть уже дан ответ, я отвечу на часть о :main. Как говорится в файле sample.project.clj , ключ :main должен иметь в качестве присвоенного значения пространство имен, содержащее функцию -main. Так что у вас должна быть такая функция

(defn -main [& args]
  (do-things-you-want-to-do-on-program-start))

в вашем mr1.clj. Также AFAIR, если вы хотите использовать вашу программу в качестве автономной фляги, вы должны классифицировать это пространство имен. Под этим я подразумеваю, что вы должны:

  1. Включите опцию :gen-class в определение пространства имен, например:

    (ns mr1
      (:gen-class)
      ...other options...)
    
  2. Сделать пространство имен AOT-скомпилированным (AOT означает Ahead Of Time). Для этого вам нужно указать свое пространство имен в списке скомпилированных AOT пространств имен в project.clj:

    (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 голос
/ 11 декабря 2011

Я думаю, что что-то не так с "синтаксисом" вашего объявления пространства имен.Вместо этого попробуйте следующее:

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

Измените свой: основной параметр в project.clj соответственно: оно должно быть просто mr1, в отличие от того, что я говорил ранее.

Отредактировано согласно комментариюгуголплекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...