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 显然是一些有副作用的函数,但它在这里并没有真正做任何事情,因为您忽略了该值,并且由于 startenddelivery 是从函数的参数派生的。

需要考虑的几件事:

  1. 你不应该def进入这个函数。
  2. 你正在检查是否 (= delivery "Delivery") ...这是一个二元条件,所以最好让 delivery 成为一个简单的布尔值,所以它是 (if delivery then else)
  3. 同样,我不确定 journey,但它在这里没有做任何事情。
  4. 你的函数将永远循环,因为最后一行 multipleparcels 每次都会执行。
  5. 解构不是必需的,但可以稍微清理一下
  6. 您的函数命名不当,因为 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 练习,这样您就可以理解为变量赋值(这是您正在做的并且在命令式编程风格中很常见)与求值之间的区别表达式。一旦你掌握了这个窍门,它就会变得容易得多,而且很有趣!祝你好运!