clojure - 基于依赖关系的结果排序

标签 clojure

我正在考虑解决编译目标.. 假设我有一组编译目标,每个目标都有一组自己的依赖项。

A -> B C

B -> C E 

C -> E F

D -> NONE

E -> F

F -> NONE

除非其依赖项在先前的传递中,否则无法将目标添加到传递中。即:我想要一个看起来像这样的编译步骤列表:
[[D F] [E] [C] [B] [A]]

所以,D 和 F 被编译,然后 E,然后 C 等等......这怎么做?

最佳答案

map 将是表示您的直接依赖项的自然方式

(def direct-dependencies 
  {:a #{:b :c}, :b #{:c :e}, :c #{:e :f}, :d nil, :e #{:f}, :f nil})

然后是一个简洁的(无循环检查)拓扑排序
(defn tsort [m] 
  (let [depth (fn depth [x] 
                (if (empty? (m x)) 
                  0 
                  (->> x m (map depth) (apply max) inc)))]
    (map val (sort-by key (group-by depth (keys m))))))

根据需要输出
(tsort direct-dependencies)
;=> ([:f :d] [:e] [:c] [:b] [:a])

关于clojure - 基于依赖关系的结果排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796705/

相关文章:

clojure - let 的这种用法有代码味道吗

clojure - 如何检查变量是否在 clojure 中实现了接口(interface)?

clojure - 像使用 ruby​​ Rspec 一样测试 CRUD Clojure 函数

clojure - 如何在 Clojure 中获取调用堆栈?

function - 为什么 println 函数不是纯函数? (Clojure)

clojure - 在Clojure中过滤字母字符

testing - 在 deftest 中使用 cider 调试

concurrency - 没有 "read"引用的 clojure 引用集的语义是什么?

clojure - 从嵌套映射中获取值

emacs - 在 Emacs 中安装 Clojure 时,我收到很多警告和错误