Clojure tools.analyzer - определить последний листовой узел? - PullRequest
0 голосов
/ 07 мая 2019

Я изо всех сил пытаюсь найти надежное решение проблемы, с которой я сталкиваюсь, используя tools.analyzer.

То, чего я пытаюсь достичь, это, учитывая узел ast, что является последним/ самый дальний узел в дереве?Например, если был проанализирован следующий код: (def a (do (+ 1 2) 3))

Существует ли надежный способ пометить узел со значением «3» как последний узел в этом дереве?По сути, я пытаюсь определить, какая форма будет в конечном итоге привязана к переменной b.

1 Ответ

0 голосов
/ 07 мая 2019

Подобные вопросы являются причиной, по которой я создал библиотеку 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}]]]]])))))

В зависимости от вашей конкретной цели, вы можетепродолжить обработку дальше.

...