【问题标题】:Passing defrecord into function clojure将 defrecord 传递给函数 clojure
【发布时间】:2017-03-20 12:22:50
【问题描述】:

我目前正在 Clojure 中开发路线规划机器人。机器人接收一个包裹,其中包含一组停靠点,然后这个机器人被传递给一个计算最短路线的函数。

(defn journey [start end]
  (alg/pprint-path (alg/shortest-path all-edges {:start-node start, :end-node end, :cost-attr :weight})))


(defn fullpath [& stops]
  (doall (map (fn [a b] (journey a b)) stops (rest stops) )))

以上两个函数计算停靠点之间的最短路线并打印出来。

;;passed into robot
(defrecord Parcel [start
                   end
                   home])

;;passed into robotroute to plan journey of robot
(defrecord Robot [stops]) 

;;computes the path
(defn robotroute [robot]
  (def stops (:stops robot))
  (fullpath stops))


(def task1parcel (Parcel. :main-office :r131 :main-office))
(def task1robot (Robot. task1parcel))
(def task1 (robotroute task1robot))

(task1)

以上是我创建机器人和包裹的代码。 Robotroute 是我传递给机器人的函数,用于去除停靠点并使用完整路径规划路线。

所有的功能都可以定义等等。但是当尝试运行任务 1 时,我得到了以下错误。

ClassCastException clojure.lang.LazySeq cannot be cast to clojure.lang.IFn  funcprog2.core/eval13519 (form-init1291893531842170235.clj:1)

谁能帮忙解决这个错误?

另外,我希望机器人能够容纳多个包裹,这样它就可以连续执行多个包裹,那么推进这个的最佳计划是什么?

【问题讨论】:

    标签: clojure shortest-path


    【解决方案1】:

    (defn fullpath [& stops] (doall (map (fn [a b] (journey a b)) stops (rest stops) )))

    function fullpath 返回一个lazyseq。 (task1) 将再次评估这个lazeseq 也许你可以通过将“task1”放入repl来得到你的结果。

    例如(def list '(1 2 3)) list 等于'(1 2 3). (list) 最终会得到“ClassCastException clojure.lang.PersistentList cannot be cast to clojure.lang.IFn”

    还有一点就是试试

    (defn robotroute [robot]
             (let [stops (:stops robot)] (fullpath stops)))
    

    在clojure中的一个建议是:在定义函数时使用let而不是def来绑定变量,因为def意味着全局

    【讨论】:

    • 拜托,您不需要将其称为“建议”:不要在函数体中使用def。它在当前命名空间中创建了一个全局变量,这实际上不是预期的,这通常是一个非常糟糕的主意。
    【解决方案2】:
    1. (def stops 在 roboroute 内部 - 那不应该是 let 吗?
    2. (robotroute task1robot) 返回 fullpath 返回的任何内容,即 (doall (map ... - 这是一个序列 - 并且序列不可调用/不是函数(如错误所示)。因此像(task1) 一样调用它失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多