Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-输出以错误的顺序出现_Clojure_Shortest Path - Fatal编程技术网

Clojure-输出以错误的顺序出现

Clojure-输出以错误的顺序出现,clojure,shortest-path,Clojure,Shortest Path,我在做一个路线规划机器人。该机器人使用ubergraph穿越办公室的各个房间,可以收集和递送包裹。然而,当我想要规划一条路线,然后输出包裹已交付的事实时,“已交付”消息将在路线计划之前输出 我知道为什么会发生这种情况,这是因为我的if语句中的顺序等。然而,我已经尝试了我能想到的所有打印位置,但我无法让它工作 有人能看到我需要把下面的代码移到哪里吗 (journey start end) 如果包含函数的完整代码,请参见下文 (defn multipleparcels [parcel] (de

我在做一个路线规划机器人。该机器人使用ubergraph穿越办公室的各个房间,可以收集和递送包裹。然而,当我想要规划一条路线,然后输出包裹已交付的事实时,“已交付”消息将在路线计划之前输出

我知道为什么会发生这种情况,这是因为我的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))))))

旅程
显然是一个副作用函数,但它在这里并没有真正起到任何作用,因为您忽略了该值,而且
开始
结束
,和
交付
都是从函数的参数派生出来的

需要考虑的几件事:

  • 您不应该
    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如果我的回答对你有帮助,而你又继续前进其他问题等,如果你觉得有帮助,请将答案标记为已接受并投票。