Clojure - 输出顺序错误
Clojure - outputs appearing in wrong order
我正在研究路线规划机器人。该机器人使用 ubergraph 遍历办公室的房间,并可以收集和递送包裹。但是,当我想计划路线然后输出包裹已送达的事实时, "Delivered" 消息在路线计划之前输出。
我知道为什么会发生这种情况,这是因为我的 if 语句中的顺序等。但是,我已经尝试了我能想到的每个打印位置,但我无法让它工作。
谁能看到我需要将以下代码行移到哪里?
(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))))))
journey
显然是一些有副作用的函数,但它在这里并没有真正做任何事情,因为您忽略了该值,并且由于 start
、end
和 delivery
是从函数的参数派生的。
需要考虑的几件事:
- 你不应该
def
进入这个函数。
- 你正在检查是否
(= delivery "Delivery")
...这是一个二元条件,所以最好让 delivery
成为一个简单的布尔值,所以它是 (if delivery then else)
- 同样,我不确定
journey
,但它在这里没有做任何事情。
- 你的函数将永远循环,因为最后一行
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 练习,这样您就可以理解为变量赋值(这是您正在做的并且在命令式编程风格中很常见)与求值之间的区别表达式。一旦你掌握了这个窍门,它就会变得容易得多,而且很有趣!祝你好运!
我正在研究路线规划机器人。该机器人使用 ubergraph 遍历办公室的房间,并可以收集和递送包裹。但是,当我想计划路线然后输出包裹已送达的事实时, "Delivered" 消息在路线计划之前输出。
我知道为什么会发生这种情况,这是因为我的 if 语句中的顺序等。但是,我已经尝试了我能想到的每个打印位置,但我无法让它工作。
谁能看到我需要将以下代码行移到哪里?
(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))))))
journey
显然是一些有副作用的函数,但它在这里并没有真正做任何事情,因为您忽略了该值,并且由于 start
、end
和 delivery
是从函数的参数派生的。
需要考虑的几件事:
- 你不应该
def
进入这个函数。 - 你正在检查是否
(= delivery "Delivery")
...这是一个二元条件,所以最好让delivery
成为一个简单的布尔值,所以它是(if delivery then else)
- 同样,我不确定
journey
,但它在这里没有做任何事情。 - 你的函数将永远循环,因为最后一行
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 练习,这样您就可以理解为变量赋值(这是您正在做的并且在命令式编程风格中很常见)与求值之间的区别表达式。一旦你掌握了这个窍门,它就会变得容易得多,而且很有趣!祝你好运!