【发布时间】:2019-07-29 17:35:25
【问题描述】:
我目前正在阅读“Clojure for the Brave and True” 在当前章节中,他们正在解释一个程序,该程序采用代表霍比特人身体部位的哈希图向量。由于仅以不对称方式提供带有零件的列表(仅左臂、左眼等是其中的一部分),因此有必要编写一个添加相应右侧零件的函数。后来有一个练习来扩展这个函数以获取一个数字并为每个左边的身体部位添加该数量的身体部位。第二个函数会随机选择一个身体部位。
这是我的代码:
(ns clojure-noob.core
(:gen-class)
(:require [clojure.string :as str] ))
(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 2}
{:name "left-shoulder" :size 3}
{:name "left-upper-arm" :size 3}
{:name "chest" :size 10}
{:name "back" :size 10}
{:name "left-forearm" :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 make-sym-parts [asym-set num]
(reduce (fn [sink, {:keys [name size] :as body_part}]
(if (str/starts-with? name "left-")
(into sink [body_part
(for [i (range num)]
{:name (str/replace name #"^left" (str i))
:size size})])
(conj sink body_part)))
[]
asym-set))
(defn rand-part [parts]
(def size-sum (reduce + (map :size parts)))
(def thresh (rand size-sum))
(loop [[current & remaining] parts
sum (:size current)]
(if (> sum thresh)
(:name current)
(recur remaining (+ sum (:size (first remaining)))))))
(defn -main
"I don't do a whole lot ... yet."
[arg]
(cond
(= arg "1") (println (make-sym-parts asym-hobbit-body-parts 3))
(= arg "2") (println (rand-part asym-hobbit-body-parts))
(= arg "3") (println (rand-part (make-sym-parts asym-hobbit-body-parts 3)))))
所以
lein run 1
工作并打印出扩展的向量
lein run 2
也可以工作并打印出随机的身体部位名称。
但是:
lein run 3
会产生以下错误:
861 me@ryzen-tr:~/clojure_practice/clojure-noob$ lein run 3
862 Exception in thread "main" Syntax error compiling at (/tmp/form-init15519101999846500993.clj:1:74).
863 at clojure.lang.Compiler.load(Compiler.java:7647)
864 at clojure.lang.Compiler.loadFile(Compiler.java:7573)
865 at clojure.main$load_script.invokeStatic(main.clj:452)
866 at clojure.main$init_opt.invokeStatic(main.clj:454)
867 at clojure.main$init_opt.invoke(main.clj:454)
868 at clojure.main$initialize.invokeStatic(main.clj:485)
869 at clojure.main$null_opt.invokeStatic(main.clj:519)
870 at clojure.main$null_opt.invoke(main.clj:516)
871 at clojure.main$main.invokeStatic(main.clj:598)
872 at clojure.main$main.doInvoke(main.clj:561)
873 at clojure.lang.RestFn.applyTo(RestFn.java:137)
874 at clojure.lang.Var.applyTo(Var.java:705)
875 at clojure.main.main(main.java:37)
876 Caused by: java.lang.NullPointerException
877 at clojure.lang.Numbers.ops(Numbers.java:1068)
878 at clojure.lang.Numbers.add(Numbers.java:153)
879 at clojure.core$_PLUS_.invokeStatic(core.clj:992)
880 at clojure.core$_PLUS_.invoke(core.clj:984)
881 at clojure.lang.ArrayChunk.reduce(ArrayChunk.java:63)
882 at clojure.core.protocols$fn__8139.invokeStatic(protocols.clj:136)
883 at clojure.core.protocols$fn__8139.invoke(protocols.clj:124)
884 at clojure.core.protocols$fn__8099$G__8094__8108.invoke(protocols.clj:19)
885 at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:27)
886 at clojure.core.protocols$fn__8131.invokeStatic(protocols.clj:75)
887 at clojure.core.protocols$fn__8131.invoke(protocols.clj:75)
888 at clojure.core.protocols$fn__8073$G__8068__8086.invoke(protocols.clj:13)
889 at clojure.core$reduce.invokeStatic(core.clj:6824)
890 at clojure.core$reduce.invoke(core.clj:6810)
891 at clojure_noob.core$rand_part.invokeStatic(core.clj:39)
892 at clojure_noob.core$rand_part.invoke(core.clj:38)
893 at clojure_noob.core$_main.invokeStatic(core.clj:54)
894 at clojure_noob.core$_main.invoke(core.clj:48)
895 at clojure.lang.Var.invoke(Var.java:384)
896 at user$eval140.invokeStatic(form-init15519101999846500993.clj:1)
897 at user$eval140.invoke(form-init15519101999846500993.clj:1)
898 at clojure.lang.Compiler.eval(Compiler.java:7176)
899 at clojure.lang.Compiler.eval(Compiler.java:7166)
900 at clojure.lang.Compiler.load(Compiler.java:7635)
901 ... 12 more
我不知道为什么会这样。谷歌搜索错误的第一行也不会显示有用的信息。有谁知道这个问题吗?
【问题讨论】:
标签: clojure