Clojure - 输出错误的顺序

时间:2017-03-20 20:58:28

标签: clojure shortest-path

我正在研究路线规划机器人。机器人使用ubergraph遍历办公室的房间,可以收集和交付包裹。然而,当我想要计划一条路线然后输出一个包裹已被交付的事实时,已经交付了#34; 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))))))

1 个答案:

答案 0 :(得分:1)

journey显然是一些副作用函数,但它实际上并没有做任何事情,因为你忽略了这个值,因为startend和{ {1}}来自函数的参数。

需要考虑的一些事项:

  1. 你不应该delivery在这个功能中。
  2. 您正在检查def是否...这是一个二元条件,所以最好让(= delivery "Delivery")成为一个简单的布尔值,所以{{1} {{1} }}
  3. 同样,我不确定delivery,但它在这里没有做任何事情。
  4. 您的函数将永远循环,因为每次执行最后一行(if delivery then else)
  5. 没有必要进行解构,但可以稍微清理一下
  6. 你的功能名称不好,因为journey并没有真正说明做什么的功能。此外,您的参数multipleparcels表示当上下文显示它应该接收多个时,它会收到一个宗地。
  7. 以下是执行某些操作的代码,即使它不是您想要的,也许您可​​以获得有关如何处理数据的一些想法:

    multipleparcels

    我建议退一步,做一些基本的clojure练习,这样你就可以理解为一个变量赋值的区别,这是你正在做的和在命令式编程风格中常见的,以及评估表达式。一旦掌握了这一点,就会变得更容易,更有趣!祝你好运!