我正在学习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-parts
,asym-hobbit-body-parts
,asym-hobbit-body-parts
和hit
复制/粘贴到REPL中,然后可以正常运行(hit asym-hobbit-body-parts)
,所以我相信这些功能/定义不是拼写错误或相似之处。
我假设错误在:
(defn -main
(hit asym-hobbit-body-parts))
我尝试使用Google搜索错误消息,但找不到任何可以解释我出错的地方。
我对如何使用-main
功能缺少什么? / Clojure项目如何运作?
答案 0 :(得分:13)
我在校对我的问题时发现了这个错误。
我错过了-main
函数中的参数,它应该是:
(defn -main
[]
(hit asym-hobbit-body-parts))
修复它然后暴露第二个错误,即主函数的定义需要在文件的末尾而不是在开始时。否则你会收到此错误:
线程“main”中的异常java.long.RuntimeException:无法解析符号:在此上下文中命中,编译:(clojure_crash_course / core.clj:6:3)
因为调用hit
时-main
(以及它随后使用的其他函数)将不在范围内。