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

时间:2016-04-17 20:59:27

标签: clojure

我正在学习Clojure,使用“Clojure for the Brave and True”。在Chapter 3: A 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))))))))

当我使用lein run运行时,出现以下错误:

  

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

我已将源文件中的asym-hobbit-body-partsasym-hobbit-body-partsasym-hobbit-body-partshit复制/粘贴到REPL中,然后可以正常运行(hit asym-hobbit-body-parts),所以我相信这些功能/定义不是拼写错误或相似之处。

我假设错误在:

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

我尝试使用Google搜索错误消息,但找不到任何可以解释我出错的地方。

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

1 个答案:

答案 0 :(得分:13)

我在校对我的问题时发现了这个错误。

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

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

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

  

线程“main”中的异常java.long.RuntimeException:无法解析符号:在此上下文中命中,编译:(clojure_crash_course / core.clj:6:3)

因为调用hit-main(以及它随后使用的其他函数)将不在范围内。