因为要生成代码, 中间代码的顺序是缺失的, 需要手动生成,
先来看 Clojure 本身的情况, 如果是这样的代码, 定义的顺序是必要的:
(def a 1)
(def b (inc a))
(def c (inc b))
(defn f1 []
(inc c))
(defn f2 []
(inc (f1)))
(defn f3 []
(+ (f2) c a))
(declare g2)
(defn g1 []
(inc (g2)))
(defn g2 []
(inc (g1)))
这个例子当中含有这些变量名:
a b c f1 f2 f3 g1 g2
以及这样的依赖关系:
b -> a
c -> b
f1 -> c
f2 -> f1
f3 -> f2 a c
g1 -> g2
g1 -> g2
现在我的问题是我得到的代码定义的顺序是乱的, 我可以通过分析代码判断每个定义依赖什么.
但是我怎么样能从这布局的依赖信息推导出一个正确的顺序呢? 而且要写成一个通用的算法…