Clojure-输出以错误的顺序出现
我在做一个路线规划机器人。该机器人使用ubergraph穿越办公室的各个房间,可以收集和递送包裹。然而,当我想要规划一条路线,然后输出包裹已交付的事实时,“已交付”消息将在路线计划之前输出 我知道为什么会发生这种情况,这是因为我的if语句中的顺序等。然而,我已经尝试了我能想到的所有打印位置,但我无法让它工作 有人能看到我需要把下面的代码移到哪里吗Clojure-输出以错误的顺序出现,clojure,shortest-path,Clojure,Shortest Path,我在做一个路线规划机器人。该机器人使用ubergraph穿越办公室的各个房间,可以收集和递送包裹。然而,当我想要规划一条路线,然后输出包裹已交付的事实时,“已交付”消息将在路线计划之前输出 我知道为什么会发生这种情况,这是因为我的if语句中的顺序等。然而,我已经尝试了我能想到的所有打印位置,但我无法让它工作 有人能看到我需要把下面的代码移到哪里吗 (journey start end) 如果包含函数的完整代码,请参见下文 (defn multipleparcels [parcel] (de
(journey start end)
如果包含函数的完整代码,请参见下文
(defn multipleparcels [parcel]
(def newparcel (first parcel))
(def start (:start newparcel))
(def end (:end newparcel))
(def delivery (:delivery newparcel))
(if (empty? parcel)
(println "Deliveries Completed")
(if (= delivery "Delivery")
(println "Parcel Delivered")
(println "Parcel Collected")))
(journey start end)
(multipleparcels (rest parcel)))
非常感谢任何提示
编辑:我现在设法实现了什么
(defn multipleparcels [parcel]
(let [newparcel (first parcel)
start (:start newparcel)
end (:end newparcel)
delivery (:delivery newparcel)]
(if (empty? parcel)
(println "Deliveries Completed")
(doall (journey start end)
(if delivery
(println "Parcel Delivered")
(println "Parcel Collected"))
(multipleparcels (rest parcel))))))
旅程
显然是一个副作用函数,但它在这里并没有真正起到任何作用,因为您忽略了该值,而且开始
,结束
,和交付
都是从函数的参数派生出来的
需要考虑的几件事:
def
ing在此函数中(=delivery“delivery”)
。。。这是一个二进制条件,因此最好让传递
是一个简单的布尔值,因此它是(如果传递,则为else)
multipleparcels
,每次都会执行multipleparcels
实际上没有说明函数正在做什么。此外,当上下文提示它应该接收多个包裹时,参数parcel
意味着它接收一个包裹(def data
[{:start "a" :end "c" :delivery true}
{:start "d" :end "f" :delivery false}
{:start "x" :end "y" :delivery true}])
(defn process-parcels
[[{:keys [start end delivery] :as parcel} & parcels]]
(if parcel
(do
(if delivery
(println "Parcel Delivered")
(println "Parcel Collected"))
(process-parcels parcels))
(println "Deliveries Completed")))
(process-parcels data)
Parcel Delivered
Parcel Collected
Parcel Delivered
Deliveries Completed
=> nil
我建议退一步,做一些基本的clojure练习,这样你就可以理解给变量赋值和计算表达式之间的区别了,变量赋值是你正在做的事情,在命令式编程中很常见。一旦你掌握了这个窍门,它就会变得更加简单和有趣!祝你好运 不幸的是,您在使用Clojure代码之前犯了严重的错误(编写了所有命令),请查看一些Clojure教程。您好,我已经添加了与旅程相关的代码,并在我的问题中演示了如何使用这些函数。我现在将尝试实现您的代码风格。任何与我的其他代码相关的进一步提示都非常感谢Hi Josh,我已经实现了你的一些建议,我现在已经让它工作了。我写的代码是否更实用,还是仍然有问题?@benjano你有些地方放错了-调用
doall
是不正确的(即使你真的打算强制实现一个懒惰的seq,我假设你在那里这么做,你也没有对结果做任何事情;即使它对你的程序有必要的副作用,你的函数只依赖于它的单个输入,包
,所以你的旅程
调用不能做任何事情(与此功能不同)。此外,您的缩进和样式使其不清晰。但是,它比您的第一次尝试要好。我不确定您称我为“旅程”是什么意思?旅程是我的功能,它规划最短路径并打印出所走的路线。我不确定您称之为“未完成”是什么意思relevant@benjano如果我的回答对你有帮助,而你又继续前进其他问题等,如果你觉得有帮助,请将答案标记为已接受并投票。