Застежки-молнии хранят ветвь?, Потомки и делают функции как мета в loc, обертывающем узел, и кажется, что auto добавляет или удаляет мету в оболочку loc (вектор) вокруг объекта, а не сам объект. Так что я думаю, что это не проблема.
Можете ли вы объяснить больше о том, что "просто не работает"?
Одним из мест, которые выглядят подозрительно (и это сбило меня с толку обычными молниями), является функция branch?
. Обратите внимание, что ваше первое and
условие в token=
проверяет branch?
- если у токена нет дочерних элементов, оно не будет совпадать с token=
, что может удивить. ветка? на самом деле говорит, возможно ли 1011 * для узла иметь детей, поэтому иногда вы хотите вернуть true, даже если у него на самом деле нет детей. Кроме этого, я не вижу ничего очевидного.
Примечание. В java->, поскольку у вас есть только одна опция, вы можете упростить анонимную функцию. Если это всегда строка, то вы можете просто заменить всю анонимную функцию на token=
. Или, если вам нужно обработать не строковый регистр и вернуть nil, вы можете захотеть (when (string? %) (token= %))
.
Я фактически атаковал почти такую же проблему в прошлом по другому маршруту. Не уверен, что это поможет вообще, но на всякий случай ...
Я построил грамматику Antlr, которая выдает вывод, который я хотел пройти и изменить в Clojure как дерево. Решение, которое я выбрал, было:
- Antlr грамматика ->
- Грамматика древовидного дерева (массаж, независимость от языка) ->
- Шаблоны строк Antlr (специфичные для Clojure) для генерации ->
- Закрытие структур данных в виде строк ->
- считывание структур данных Clojure во вложенное дерево (записи для нас, но может быть любым)
Одним из преимуществ этого было то, что код Antlr Java не зависел напрямую от кода Clojure (только в формате передаваемых строк), что делало код Clojure зависимым только от сгенерированного кода Java. Это немного упростило структуру зависимостей при компиляции проекта (я думаю, вы также достигли этого). Другое преимущество заключается в том, что грамматика и древовидная грамматика не зависели от языка, поэтому вы могли создавать Clojure и / или Java и / или другие цели из одной и той же грамматики (не то чтобы я это делал на самом деле).