我正在学习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-parts并hit从我的源文件到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调用时不在范围内.
| 归档时间: |
|
| 查看次数: |
1904 次 |
| 最近记录: |