Clojure - 传递给doall的错误数量的args

时间:2017-03-21 17:46:48

标签: clojure shortest-path

我目前正在研究路线规划机器人,并且在向doall传递错误数量的参数时遇到错误。

(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))))))

我在以下函数中使用此代码。

(defn robotroute [robot]
  (let [parcels (:parcels robot)
  numstops (:numStops robot)]
  (if (= 1 numstops)
    (oneparcel parcels)
    (multipleparcels parcels))
   (calccost parcels 0)))

然后我使用以下代码来使用这些函数:

(def task3parcel [(Parcel. :main-office :r113 false)
                  (Parcel. :r113 :r115 true)])
(def task3robot (Robot. task3parcel 2))
(def task3 (robotroute task3robot)

代码贯穿并输出所有正确的信息。但最后我得到以下错误。

CompilerException clojure.lang.ArityException: Wrong number of args (3) passed to: core/doall, compiling:(form-init9046500356350698733.clj:1:12) 

错误是阻止我的calccost代码运行。任何人都可以看到这个错误来自哪里?我已经尝试过移动支架等等。但到目前为止我还没有得到任何工作。

任何人都可以看到此错误的来源吗?如果有的话,是否有人有任何解决方法?

编辑:实施建议的答案。

(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 :(得分:3)

由于错误声明您将三个参数传递给doall而不是预期的参数。这是由于错误的括号。包含if表达式还包含三个参数,而不是预期的一个或两个参数。如果要将某些副作用作为表达式的一部分执行,请使用do

(if (empty? parcel)
    (do
      (println "Deliveries Completed")
      (doall (journey start end)))
      (if delivery
        (println "Parcel Delivered")
        (println "Parcel Collected")))

请注意,您正在放弃(journey start end)

返回的评估序列