Clojurians
#clojure-russia
<
2016-01-06
>

This page is not created by, affiliated with, or supported by Slack Technologies, Inc.

andrewtropin07:01:00

У меня сегодня немного странный вопрос, напрямую никак не относящийся к кложуру. Кто в чём делает слайды?

trybeee07:01:33

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

andrewtropin07:01:16

Спасибо, impress выглядит очень прикольно

andrewtropin07:01:54

с недавних пор я променял vim на spacemacs : (

delaguardo08:01:01

таже фигня, но старый конфиг никуда не делся)

andrewtropin08:01:03

я обычно https://bitbucket.org/rivanvx/beamer/wiki/Home пользовался, но давно подумываю перебраться в браузер. Мне ещё интересно, чем пользуется @nicola, он вроде весьма часто выступают на всяких конф-ах.

andrewtropin08:01:07

в голом латехе или какие пакетики юзает?

dottedmag08:01:39

@andrewtropin: Keynote.app

nicola08:01:27

+ gh-pages

razum2um13:01:13

давайте проголосуем за cljs, поднажмем http://www.slant.co/topics/558/compare/~elm_vs_clojurescript_vs_purescript

mike145216:01:29

привет всем! кто-нибудь знает идиоматический способ state propagation в ClojureScript/Reagent ? То есть когда есть @a и зависящие от его стейта другие атомы @b и @c и при изменении @a, состояние атомов @b и @c апдейтилось автоматом. пока нашел https://github.com/lynaghk/reflex

rm16:01:34

идиоматический способ -- не иметь такой ситуации

nicola17:01:37

А зачем тебе?

pacman17:01:37

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

pacman17:01:00

наприммер листнер на @a при обновлении данных меняет чтото на @b и @c

ul18:01:45

@mike1452: в Reagent есть reaction, можно в https://github.com/Day8/re-frame посмотреть, как этим пользоваться

ul18:01:54

есть другие альтернативы для решения этой задачи, но если пользоваться реагентом, то в нём уже есть своё

nicola19:01:59

Но всеже, зачем? Интересно

nicola19:01:12

Какой кейс

ul19:01:36

Ну, половина ре-фрейма как архитектуры (та, что про подписки) — этот самый кейс

ul19:01:47

Я думаю, камрад что-то подобное замышляет

mike145220:01:10

подсказали ответ на соседнем канале

mike145220:01:31

(:require [reagent.core :as r] [reagent.ratom :as rr])

mike145220:01:40

(:require-macros [reagent.ratom :refer [reaction]])

mike145220:01:50

(def value1 (r/atom 0)) (def value2 (reaction (+ 3 @value1)))

mike145220:01:25

теперь каждый раз при изменении value1, автоматом будет выполняться и update значения value2

mike145220:01:51

по формуле (+ 3 @value1)

mike145220:01:10

а еще можно сделать автоматический вызов функции вместо апдейта

mike145220:01:25

это делается через некий make-reaction

mike145220:01:36

но он что-то пока не заработал у меня

mike145220:01:38

(rr/make-reaction (fn [] (js/alert "value1 is changed." @value1)) :auto-run true)

mike145220:01:46

кейс несколько абстрактный. пока изучаю инфраструктуру clojurescript/reagent, прежде чем ваять веб-интерфейс своего сервиса. у меня бэкэнд готов и я пытаюсь понять как мне автоматически апдейтить видимые элементы UI в зависимости от событий на бэкэнде. А на самом UI есть зависимые элементы. На эту тему у Соловьева Александра видел прикольную лекцию, где он про "ячейки экселя" рассказывал. Вот хотел найти идиоматический способ в регенте, чтобы javelin не тащить.

dottedmag20:01:23

@asolovyov: Опять тебя склоняют. Давай, отдувайся :-P

asolovyov21:01:19

я позавчера выпилил javelin из фронтенда у себя, потому что он тормозит в файрфоксе, и адово тормозит на андроиде

asolovyov21:01:57

@mike1452: идиоматического способа не знаю, я реагент не юзаю, а для своего стаффа построил руками обëртку типа derived-atom

asolovyov21:01:35

я думаю, что у тебя должен быть (def value2 (reaction (+ 3 value1))), потому что иначе ты туда передаëшь значение value1 - как оно за ним следить начнëт?

mike145221:01:40

@asolovyov: Александр, приветствую. проверил только что. Правильно (def value2 (reaction (+ 3 @value1)))

mike145221:01:13

если убрать @ то пишет вместо значения слово Object и ничего не меняет

asolovyov21:01:29

хм, а можешь дать линк на ссылку?

asolovyov21:01:40

как-то это неправильно выглядит, зачем тогда reaction?

asolovyov21:01:49

можно просто сделать (def value2 (+ 3 @value1)) :simple_smile:

asolovyov21:01:56

линк на доку :))

asolovyov22:01:28

ааа, всë, понял как оно работает

asolovyov22:01:34

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

asolovyov22:01:50

всë просто довольно

mike145222:01:51

да, он и работает. я его как раз и нашел

asolovyov22:01:05

аа, всë, я дочитался :smile:

asolovyov22:01:12

ну по-моему норм кейс :smiley:

asolovyov22:01:41

у меня всë совсем с другой стороны, плюс я так реагент ни разу и не заюзал, плюс я невнимательно читаю иногда :))

mike145222:01:54

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

mike145222:01:56

@(rr/make-reaction (fn [] @value1 (.log js/console "change detected.")) :auto-run true)

mike145222:01:23

каждый раз при изменении @value1 будет вызываться функция печати на консоль

asolovyov22:01:57

я тут кстати уже выступал на эту тему, но @prepor со мной ацки не согласен, что re-frame убивает те минимальные гарантии и ворнинги, что компилятор cljs даëт, и вот недавно пробегало нечто более похожее на то, что я хочу: https://github.com/krisajenkins/petrol

asolovyov22:01:24

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

ilshad23:01:53

@mike1452 делать с одним атомом (single source of truth, этакий “db"), в reagent’овских функциях возвращать функцию, перед этим сделав “курсор” в нужное место этого атома c помощью reaction, и в возвращаемой функции уже deref’ать его. И не надо никакого re-frame’а. Хендлеры же описывать в отдельном месте, чтобы не загромождать вьюшки, можно всегда с сигнатурой reducing функции, тогда вся логика - это будет по сути свертка по потоку всех событий в системе.

ilshad23:01:32

я это называю reduce-архитектура (вместо re-frame архитектуры), но это почти что re-frame без re-frame’a, почти

mike145223:01:26

@ilshad я так и делаю. re-frame не использую. только reagent. вот думаю, вместо эфемерного "эдакий db" может ли сгодиться datascript?

ilshad23:01:59

просто атом с мэпом и тд - это работает хорошо. Как делать с datascript - не знаю. Мне кажется, с ним reaction не нужен будет, а значит и reagent не нужен

mike145223:01:39

атом с мапой - это глобальный стейт приложения?

ilshad23:01:01

так-то это как бы костыль тоже - приходится делать “курсор” с помощью reaction только потому, что ре-рендеринг срабатывает в контексте deref, а он (deref) - делается на весь атом, а не на часть дерева. Ну, т.е. сам reagent в этом смысле тоже костыль, но удобный достаточно.

ilshad23:01:17

Да, один атом, в котором весь стейт

ilshad23:01:04

Наивный подход при использовании Reagent - это много атомов

ilshad23:01:28

они имеют тенденцию разрастаться, и очень быстро приходишь к необходимости их как-то синкать

mike145223:01:35

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

ilshad23:01:51

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

ilshad23:01:31

(defn my-view [] (let [bar (-> @db :foo :bar reaction)] (fn [] [:h1 @bar])))

mike145223:01:35

мне как раз нужно запилить функционал админки

ilshad23:01:08

у админок часто бывает так, что там:

ilshad23:01:26

1) большое количество страниц, по сути не зависимых друг от друга

ilshad23:01:52

2) много переиспользуемых форм и таблиц

ilshad23:01:50

из-за большого кол-ва страниц стратегия с множеством атомов не самая плохая, по идее

mike145223:01:11

спасибо за пример view'шки. у меня пока опыта в ui ноль, вот сижу разбираюсь.

ilshad23:01:20

для локального стейта акждой страницы

ilshad23:01:28

этот пример - пример того, как вьющка перерендеривается только тогда, когда изменился [:foo :bar], а не весь атом

ilshad23:01:20

(исправил)

nicola23:01:29

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

nicola23:01:03

Или я что-то недопонял?

nicola23:01:56

Или ты уже оптимизируешь?