Fork me on GitHub
#clojure-russia
<
2016-09-14
>
seryh02:09:42

у нас же не хаскель. а раз идет работа с графом, почему бы не взять вектор атомов?

[<atom> <atom> <atom> ...]
, где atom узел дерева с изменяемыми свойствами {:id <int>, :value <any>, :left <int>, :right <int>}

kishanov03:09:53

Для работы с графами есть отличная библиотека https://github.com/Engelberg/ubergraph, если руками самому надо что-то легковесное - самый просто способ сделать список смежности как в этой статье (http://hueypetersen.com/posts/2013/06/25/graph-traversal-with-clojure/), его очень просто обрабатывать

kishanov03:09:57

еще очень полезно для прокачки кунг-фу порешать на hackerrank’е задачки на графы (https://www.hackerrank.com/domains/algorithms/graph-theory/difficulty/all/page/1) и на функциональные структуры данных (https://www.hackerrank.com/domains/fp/ds/difficulty/all/page/1), они с незапяматных времен принимают решения на кожуре

andre05:09:59

подскажите, есть функция, нужно проанализировать ее формы и выполнить в рантайме определенные действия. допустим если в этой функции есть форма выполнения определенного символа , записать это в список

andre05:09:31

можно сделать это как-то макросом не оборачивая эту функцию?

artemyarulin07:09:18

ничо не понял, можно пример что на входе и что ты хочешь на выходе? @andre

andre07:09:48

вот у меня есть код

andre07:09:51

там есть функция

andre07:09:24

я хочу проанализировать эту функцию и если в ней есть формы вызовов интересующие меня, в рантайме добавить это в список

andre07:09:21

веровно непонятно? ну т.е. я в рантайме хочу иметь информацию что етсь такая то функция и она может сделать такие то вызовы

kxepal07:09:52

трассировка вызовов, короче, да?

andre07:09:34

конкретно, есть re-frame приложение, у него есть view, которая может содержать подписку на стейт subscribe и может диспатчить евенты dispatch, я хочу получить объект views условно в котром будут эти вью и их подписки и диспатчи

andre07:09:17

для визуализации работы re-frame

andre07:09:18

сделал такую штуку пока

artemyarulin07:09:10

Т.е. ты хочешь прочитать сорс функции грубо говоря и узнать есть в нем вызов нужной тебе другой функции?

andre07:09:11

т.е. все обновляется во время работы приложения, ожно быстро посмотреть стейт и вычисление сабскрипшенов, но было бы приколько если посмотреть view и на что они подписаны и что диспатчат

andre07:09:21

имено

artemyarulin07:09:52

макрос создан как раз для таких косты… хотелок trollface

andre07:09:00

я ее обернул в макрос

andre07:09:14

но это много неудобств вызывает

andre07:09:39

хотелось бы передать ее как то в макрос как параметр чтоли

artemyarulin07:09:54

эм дак передай?

andre07:09:58

а как?

andre07:09:47

т.е. во время разворачивания он ее может получить на вход как сорс по символу?

artemyarulin07:09:06

а понял, да если ты передашь символ то толку мало, если заэвалишь символ то не будет сорса

artemyarulin07:09:12

ааа, дошло! Поэтому народ делает всякие defui из ом-некста. Т.е. да - надо делать свой макрос my-defn чтоб был доступ к сорсам

artemyarulin07:09:22

а тебе нужно обязательно из самой программы это получать? Можно написать просто стороннюю прогу которая прочитает твой core.clj и найдет все вызовы чего тебе надо

artemyarulin07:09:56

прочитать файл в AST очень легко через cljs.tools.reader/read-string

andre07:09:53

ага , нужно в программе, т.е. результат должен в этом рантайме быть, программа будет взаимодействовать с этим потом, т.е. меняя стейт re-frame эти данные будут обновляться в этом идея

artemyarulin07:09:18

понял, ну тогда my-defn единственный путь

andre07:09:25

my-defn - где про это почитать?

artemyarulin07:09:49

ну я так просто назвал, я имею ввиду то что ты наверно уже сделал - обернуть в макрос

artemyarulin07:09:03

а в чем неудобство то кста?

andre07:09:16

курсив не понимает что это def

andre07:09:20

и ругается

artemyarulin07:09:55

извините не удержался 🙂

artemyarulin07:09:23

неа, хз вообще про курсив

artemyarulin07:09:37

а покаж сорс кста?

artemyarulin07:09:41

как ты макрос сделал

andre07:09:48

вот это след вопрос

andre07:09:10

я пока не понял как его сделать , первый опыт с макросами 🙂

andre07:09:52

т.е. у меня есть сейчас (defn fn [] () )

andre07:09:15

мой макрос будет (my-defn fn [] ())

andre07:09:41

он должен вернуть (some1 1) (some2 2) (defn fn [] () )

andre07:09:57

я сделал пока что работает все без (some1 1) (some2 2)

andre07:09:01

не знаю как сделать

artemyarulin07:09:19

т.е. макрос должен вернуть несколько форм получается?

andre07:09:31

получается

artemyarulin07:09:04

помнится делал такое, вроде как можно через (do form1 form2 formN)

andre07:09:05

т.е. он должен вернуть то что должно было до него без изменений и добавить несколько действий

andre07:09:16

ага вот я тоже do хотел попробовать

andre07:09:32

не успел пока

artemyarulin07:09:44

(do (def a 1) (def b 2))

artemyarulin07:09:56

ну это работает, поэтому и твое тоже должно сработать

andre07:09:21

ок, спасибо, тогда пойду таким путем

artemyarulin07:09:00

помню там была какая-то магия по поводу возврата нескольких форм, или это просто когда ты эвалишь символы, не помню уже. Делай через ду - оно точно будет работать

artemyarulin07:09:22

чиркани потом сюда с результатом - интересно чо получится

andre07:09:45

ага, обязательно

andre07:09:17

думаю полезная визуализация re-frame получится

andre07:09:19

а кто-нибудь писал макросы с фигвил?

andre07:09:23

там конечно много магии

artemyarulin07:09:02

в смысле? там можно писать макросы?

andre07:09:22

ну он вроде их перегружает

andre07:09:50

и даже мои он екпандит, хотя реагент допустим не экспанит

andre07:09:03

просто т.к. я только начал с макросами вообще работать, я не понимаю у меня ошибка в макросе или это просто фигвил пытается его перегрузить неправильно и нужно рестартовать компиляцию заново каждый раз, что долго

artemyarulin07:09:58

ааа, ты про это, хз уже не помню, я макросы как-то отдельно дебажу в кложуре режиме

artemyarulin07:09:02

смысл тебе в фигфил и вообще в CLJS прыгать то - ты ж можешь и так все в репле протестировать без контекста ре-фрейма или что там у тебя

andre07:09:20

ну да, логично

andre09:09:03

блин чем бы проще обойти все формы в глубину и сформировать результат прохода в список

artemyarulin09:09:19

либо зиппер)

andre10:09:07

postwalk немного не то, т.к. он поэлементно проходит, а мне нужно соседей еще, параметры вызова

a.espolov11:09:10

@andre: ты хочешь, чтобы клиентский апп загрузился в браузере, подтянул данных и на их основе собрал ui+логику работы+описание запросов к беку?

andre11:09:46

хочу чтобы проанализировался сорс код, потом аппа запустилась и заполнились данные из результата анализа кода и эти данные отобразились в UI и во время работы аппа взаимодействовала с этими данными

andre11:09:05

@artemyarulin tree-seq вроде подошел

andre13:09:23

а как неймспейс получить у символа?

andre13:09:25

в макросе

andre13:09:07

да глупость наверное спросил в макросе нет никакого неймспейса

andre13:09:46

хотя девкардс как-то же группируются по неймспейсу

potapenko13:09:08

Вопрос к знатокам, как думаете, что правильнее, взять какой java класс или дернуть какую консольную утилиту. Я всю программерскую жизнь делал чтобы “работало везде”. А сейчас полюбил использовать clojure.java.shell и не париться. Вот нужно zip сделать - полез вспоминать как это на джаве и понял что “да ну нах”. Дернул zip output inputs и как же просто и хорошо! Что думаете, где грабли? Или правильно делаю?