我正在努力为我正在使用tools.analyzer的问题提供可靠的解决方案。
我要实现的目标是,给定一个ast节点,树中的最后一个/最远的节点是什么?例如。如果分析了以下代码:(def a(do(+1 2)3))
是否有一种可靠的方法将标记为“ 3”的节点标记为该树中的最后一个节点?本质上,我想做的是确定最终将哪种形式绑定到var b。
答案 0 :(得分:-1)
如上所述的问题是我几年前创建tupelo.forest
库的原因。
您可能希望查看:
首先,将数据放入hiccup
格式后,将其添加为树。这是如何进行的概述,并通过单元测试显示了操作结果:
(ns tst.tupelo.forest-examples
(:use tupelo.core tupelo.forest tupelo.test))
(dotest-focus
(hid-count-reset)
(with-forest (new-forest)
(let [data-orig (quote (def a (do (+ 1 2) 3)))
data-vec (unlazy data-orig)
root-hid (add-tree-hiccup data-vec)
all-paths (find-paths root-hid [:** :*])
max-len (apply max (mapv #(count %) all-paths))
paths-max-len (keep-if #(= max-len (count %)) all-paths)]
这是结果:
(is= data-vec (quote [def a [do [+ 1 2] 3]]))
(is= (hid->bush root-hid)
(quote
[{:tag def}
[{:tag :tupelo.forest/raw, :value a}]
[{:tag do}
[{:tag +}
[{:tag :tupelo.forest/raw, :value 1}]
[{:tag :tupelo.forest/raw, :value 2}]]
[{:tag :tupelo.forest/raw, :value 3}]]]))
(is= all-paths
[[1007]
[1007 1001]
[1007 1006]
[1007 1006 1004]
[1007 1006 1004 1002]
[1007 1006 1004 1003]
[1007 1006 1005]])
(is= paths-max-len
[[1007 1006 1004 1002]
[1007 1006 1004 1003]])
(nl)
(is= (format-paths paths-max-len)
(quote [[{:tag def}
[{:tag do} [{:tag +} [{:tag :tupelo.forest/raw, :value 1}]]]]
[{:tag def}
[{:tag do} [{:tag +} [{:tag :tupelo.forest/raw, :value 2}]]]]])))))
根据您的特定目标,您可以继续进行处理。