может core.logic ?
А как он поможет? Я посмотрел, но не понял.
да, там надо сначала понять их логику. надо смотреть видео с объяснением. я с набегу тоже ничего не понял.
у них реляционное программирование. хотя именно под твои примеры оно не совсем подходит из коробки. надо будет дописывать свои реляции, видимо.
core.logic так же юзает юнификацию
В том и дело, что надо много своего писать, так что я искал готовую штуку для переписывания термов.
https://github.com/clojure/core.unify#differences-from-corelogic
может быть вот такое как-то поможет
клара немного не про это
Я уже смотрю akar
Можно, конечно, и вручную, сверху вниз дерево обойти и руками наматчить.
Но код будет нечитабельный.
смотрю акар не менее путанный, чем core.logic
С core.logic непонятно, что писать. А в akar непонятно, как писать 🙂
чтобы писать на core.logic надо поменять сознание
сейчас это делать не обязательно, но если будет интересно, то смотри на ютубе Relational Programming in miniKanren by William Byrd
наверное для твоей задачи это будет без нужды сложно
Есть хорошие туториалы по кор-лоджику где-то на гитхабе. Там можно за пару часов въехать как им пользоваться
с примерами
Тем более что есть реальная задача, я то его просто для расширения кругозора изучал
да логическое программирование-то понятно. не понятно, зачем для этой мухи такую пушку выкатывать.
Ну вроде бы как подходит под задачу. Но походу действительно надо просто унифицировать. но core.unify я не использовал, так что не могу тут подсказать) Если найдешь решение то напиши, интересно как ты это сделаешь
Да, можно и сделать, чтобы с core.logic
поиграться.
А то я The Reasoned Schemer слишком давно читал.
Оно всё растёт ногами из Пролога.
А надо из РЕФАЛа, а нету.
Вот, нашёл: https://github.com/mschuene/stratege
> core.logic is just a freaky DSL for doing exhaustive search
@dottedmag а расскажи в двух словах что за юзкейс такой интересный: для чего такое аст, и почему понадобилось именно так переписать
а то либы какие-то изотерические все
есть книжка - https://mitpress.mit.edu/books/reasoned-schemer
они своеобразно написаны, на них ок диплернинг алгоритмы учить :kappa:
@misha Да просто есть выплюнутое из C++-кода страшное дерево, я хочу его причесать, чтобы понять, что там вообще.
Дерево — AST разбора языка http://nixos.org
Там ленивый функциональный язык но с дичайшим синтаксисом, глаза сломать можно.
Балдридж делал на конже доклад как они тулзы для кложурного аст писали, может идеи подаст тебе какие-то
Например, (get-in {...} [:a :b] def)
записывается как... {...}.a.b or def
instaparse
хотя не, если уже аст есть, то спека, к @roman01la +1
А парсер мне не нужен, я из этого языка полностью разобранную форму уже достал и в виде кложурных термов выплюнул.
а что ты в этом дереве будешь искать?
но потом прийдется ходить по конформнутому спековскому дереву :opieop:
напиши интерпретатор его 🙂
Я его буду читать. У меня вообще желание сделать 2-way биндинг, чтобы 1) писать для NixOS конфигурацию на кложуре и транслировать в этот недоязычок, 2) читать их поделия без вытекания глаз.
Там, например, ;
вполне может встретиться в середине конструкции. Синтаксис такой.
ну если двустороннюю, спекой можно будет забесплатно раундтрип конформ/анформ заполучить
а у тебя рукописный пример есть инпута-аутпута?
покрупнее чем https://clojurians.slack.com/archives/C050HE28Y/p1519562415000033
на триплы и в датомик
ты предполагаешь, что там только триплы
а триплами любую структуру можно выразить
:troll:
ну и даталогом попробовать ударить
я б наверное мультиметодами, или спекой
@nicola Мне такой мощный вариант не нужен.
Скорее, можно взять unify
из core.logic
и простой обход дерева.
Так, а чем бы по pretty-print'ить целый файл *.clj
?
есть ссылка на грамматику синтаксиса?
А то выхлоп да ещё и без индентации ужс.
(-> % slurp clojure.pprint/pprint)
:D
да, действительно
Recursive sets are just normal sets, but the attributes can refer to each other. For example,
удачи, кароче
Да, то, что у них называется set — это на самом деле map.
eval всеже напрашивается 🙂
Так мне не эвалить, а читать.
Поэтому я хочу свернуть в кложурные конструкции.
Эвалюатор этой штуки уже есть.
тк это не edn, поначалу надо текст попарсить, для этого - интсапарс
@misha А зачем? У меня уже есть AST в виде кложурного дерева.
а
ну тогда спекой его
так а ты пастнул не дерево же, да?
Дерево.
так эваль в кложурные структуры
тогда поехали
@nicola А интересный вариант. Попробую.
Господа, а кто-нибудь видел библиотеку для работы с нереализованными графами? В таком графе по вершине я могу найти её соседей, но я не могу получить список всех вершин и рёбер, это computationally infeasible.
Я могу bfs, конечно, и руками написать, но было бы полезно взять готовую функцию обхода графа/поиска кратчайшего пути, и запихать туда реализацию нереализованного графа, через функции "получить начальные вершины", "найти соседей", "эта вершина — конечная?"
а потом мультиметодом собрать в кложу
Да, это можно.
Только основная задача будет найти интересные паттерны и свернуть их в идиоматичные конструкции.
у тебя всё унифицируется в туплы [:тип начинка], и по типу ты можешь мультиметод диспатчить
у тебя их там штук 10 всего в копипасте