当作为leiningen项目运行时,'参数声明<x>应该是一个向量'错误

E. *_*don 5 clojure

我正在学习Clojure,使用"Clojure for the Brave and True".在第3章:一个Clojure Crash Course的结尾,有一个例子,我们击中了一个随机选择的霍比特人的身体部位.

当我在REPL中运行代码时,代码运行正常.为了检查我是否了解如何创建和运行clojure项目,我通过运行创建了一个项目lein new app clojure-crash-course,然后编辑了生成的src/clojure_crash_course/core.clj文件,如下所示:

(ns clojure-crash-course.core
  (:gen-class))

(defn -main
  (hit asym-hobbit-body-parts))

(def asym-hobbit-body-parts [{:name "head" :size 3}
                             {:name "left-eye" :size 1}
                             {:name "left-ear" :size 1}
                             {:name "mouth" :size 1}
                             {:name "nose" :size 1}
                             {:name "neck" :size 1}
                             {:name "left-shouler" :size 3}
                             {:name "left-upper-arm" :size 3}
                             {:name "chest" :size 10}
                             {:name "back" :size 10}
                             {:name "left-foream" :size 3}
                             {:name "abdomen" :size 6}
                             {:name "left-kidney" :size 1}
                             {:name "left-hand" :size 2}
                             {:name "left-knee" :size 2}
                             {:name "left-thigh" :size 4}
                             {:name "left-lower-leg" :size 3}
                             {:name "left-achilles" :size 1}
                             {:name "left-foot" :size 2}])

(defn matching-part
  [part]
  {:name (clojure.string/replace (:name part) #"^left-" "right-")
   :size (:size part)})  

(defn symmetrize-body-parts
  [asym-body-parts]
  (reduce (fn [final-body-parts part]
              (into final-body-parts (set [part (matching-part part)])))
          []
          asym-body-parts))

(defn hit
  [asym-body-parts]
  (let [sym-body-parts (symmetrize-body-parts asym-body-parts)
        body-part-size-sum (reduce + (map :size sym-body-parts))
        target (rand body-part-size-sum)]
    (loop [[part & remaining] sym-body-parts
           accumulated-size (:size part)]
      (if (> accumulated-size target)
          part
          (recur remaining (+ accumulated-size (:size (first remaining))))))))
Run Code Online (Sandbox Code Playgroud)

当我运行它时lein run,我收到以下错误:

线程"main"中的异常java.lang.IllegalArgumentException:参数声明命中应该是一个向量,编译:(clojure_crash_course/core.clj:2:16)

我已经复制/粘贴asym-hobbit-body-parts,asym-hobbit-body-parts,asym-hobbit-body-partshit从我的源文件到REPL并可以运行(hit asym-hobbit-body-parts)很好,所以我相信这不是一个错字或那些功能/定义相似.

我假设错误在:

(defn -main
  (hit asym-hobbit-body-parts))
Run Code Online (Sandbox Code Playgroud)

我试过谷歌搜索错误信息,但找不到任何解释我出错的地方.

我对如何使用该-main功能缺少什么?/ Clojure项目如何运作?

E. *_*don 13

在证明我的问题时,我发现了错误.

我错过了-main函数中的参数,它应该是:

(defn -main
  []
  (hit asym-hobbit-body-parts))
Run Code Online (Sandbox Code Playgroud)

修复它然后暴露第二个错误,即主函数的定义需要在文件的末尾而不是在开始时.否则你会收到此错误:

例外在线程 "主" java.long.RuntimeException:无法解析符号:击中在这种情况下,编译:(clojure_crash_course/core.clj:6:3)

因为hit(以及它随后使用的其他功能)在-main调用时不在范围内.