Clojure tools.analyzer-确定最后一个叶子节点?

时间:2019-05-06 23:15:13

标签: clojure abstract-syntax-tree

我正在努力为我正在使用tools.analyzer的问题提供可靠的解决方案。

我要实现的目标是,给定一个ast节点,树中的最后一个/最远的节点是什么?例如。如果分析了以下代码:(def a(do(+1 2)3))

是否有一种可靠的方法将标记为“ 3”的节点标记为该树中的最后一个节点?本质上,我想做的是确定最终将哪种形式绑定到var b。

1 个答案:

答案 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}]]]]])))))

根据您的特定目标,您可以继续进行处理。