我目前正在Clojure的一个路径规划机器人上工作。机器人接收一个包裹,其中包含一组停站,然后这个机器人被传递到一个计算最短路径的函数中。
(defn journey [start end]
(alg/pprint-path (alg/shortest-path all-edges {:start-node start, :end-node end, :cost-attr :weight})))
(defn fullpath [& stops]
(doall (map (fn [a b] (journey a b)) stops (rest stops) )))上面的两个函数计算出站点之间的最短路径并打印出来。
;;passed into robot
(defrecord Parcel [start
end
home])
;;passed into robotroute to plan journey of robot
(defrecord Robot [stops])
;;computes the path
(defn robotroute [robot]
(def stops (:stops robot))
(fullpath stops))
(def task1parcel (Parcel. :main-office :r131 :main-office))
(def task1robot (Robot. task1parcel))
(def task1 (robotroute task1robot))
(task1)上面是我创建机器人和包裹的代码。机器人是我传递给机器人的功能,它的目的是去掉停站,并使用全路径规划路线。
所有函数都可以定义,等等。但是,当试图运行任务1时,我会得到以下错误。
ClassCastException clojure.lang.LazySeq cannot be cast to clojure.lang.IFn funcprog2.core/eval13519 (form-init1291893531842170235.clj:1)有人能帮忙纠正这个错误吗?
同时,我想要一个机器人拿着多个包裹,这样它就可以连续运送多个包裹,这样最好的计划是什么呢?
发布于 2017-03-20 13:35:55
(defn fullpath [& stops] (doall (map (fn [a b] (journey a b)) stops (rest stops) )))
函数完全路径返回一个lazyseq。(task1)将再次评估这个延迟,也许您可以通过在repl中添加"task1“来获得结果。
例如,(def list '(1 2 3))列表等于'(1 2 3). (list),最终将得到"ClassCastException clojure.lang.PersistentList不能转换为clojure.lang.IFn“。
另一点是尝试
(defn robotroute [robot]
(let [stops (:stops robot)] (fullpath stops)))在clojure中,建议是:在定义函数时使用let而不是def绑定变量,因为def意味着全局的。
发布于 2017-03-20 13:39:29
(def stops在roboroute -那不应该是let吗?(robotroute task1robot)返回fullpath返回的任何内容,即(doall (map ... --它是一个序列--序列不能调用/不是函数(正如错误提示的那样)。因此,调用它就像调用(task1)失败一样。https://stackoverflow.com/questions/42903504
复制相似问题