Size: a a a

Clojure — русскоговорящее сообщество

2020 January 03

DM

Denis Muraviev in Clojure — русскоговорящее сообщество
спасибо
источник

OS

Olim Saidov in Clojure — русскоговорящее сообщество
Denis Muraviev
я тут подумал и в более общем виде мне нужна либа которая трансформила бы мне мапы в другие мапы на основе какой то спецификации типа xslt
есть еще conference talk https://www.youtube.com/watch?v=9fhnJpCgtUw
источник

EC

Edward Crypto in Clojure — русскоговорящее сообщество
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Привет. Я делаю библиотеку эффектов и у меня вопрос по именованию.
Библиотека делает перекомпиляцию кода, как core.async. В core.async есть go и <! или >!. Т.е. макрос go перекомпилирует вложенный код.
У меня тоже есть пара break, !.
(break
(let [rnd (! (effect [:random]))]
  (- (* 2. x rnd)
     x)))

Вопрос. Правильно ли я подобрал название для макроса break? Или стоит назвать иначе?
Хочется какое-то простое и побудительное слово, как go в core.asyn.
источник

GG

Grigory Glushko in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Привет. Я делаю библиотеку эффектов и у меня вопрос по именованию.
Библиотека делает перекомпиляцию кода, как core.async. В core.async есть go и <! или >!. Т.е. макрос go перекомпилирует вложенный код.
У меня тоже есть пара break, !.
(break
(let [rnd (! (effect [:random]))]
  (- (* 2. x rnd)
     x)))

Вопрос. Правильно ли я подобрал название для макроса break? Или стоит назвать иначе?
Хочется какое-то простое и побудительное слово, как go в core.asyn.
Не понятно что делает этот макрос и почему он назван break. То что он перекомпилирует код внутри это механизм, а смысл в чём?
источник

AB

Alex Bubnov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Привет. Я делаю библиотеку эффектов и у меня вопрос по именованию.
Библиотека делает перекомпиляцию кода, как core.async. В core.async есть go и <! или >!. Т.е. макрос go перекомпилирует вложенный код.
У меня тоже есть пара break, !.
(break
(let [rnd (! (effect [:random]))]
  (- (* 2. x rnd)
     x)))

Вопрос. Правильно ли я подобрал название для макроса break? Или стоит назвать иначе?
Хочется какое-то простое и побудительное слово, как go в core.asyn.
effectful, или with-effects
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Alex Bubnov
effectful, или with-effects
о with-effects я как-то не подумал, спасибо
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Grigory Glushko
Не понятно что делает этот макрос и почему он назван break. То что он перекомпилирует код внутри это механизм, а смысл в чём?
Смысл в том, чтобы разделить побочные эффекты и логику принятия решений.
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/core_test.cljc

в этом тесте есть пример как тот же код можно выполнять с синхронными или ассинхронными эффектами.

можно делать "монадки"
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/middleware/context_test.cljc
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/middleware/reduced_test.cljc

можно сериализовывать неоконченное вычисление
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/middleware/log_test.cljc

пока кроме тестов нет никакой документации
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Смысл в том, чтобы разделить побочные эффекты и логику принятия решений.
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/core_test.cljc

в этом тесте есть пример как тот же код можно выполнять с синхронными или ассинхронными эффектами.

можно делать "монадки"
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/middleware/context_test.cljc
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/middleware/reduced_test.cljc

можно сериализовывать неоконченное вычисление
https://github.com/darkleaf/effect/blob/master/test/darkleaf/effect/middleware/log_test.cljc

пока кроме тестов нет никакой документации
что делает break?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
и что делает !?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
что делает break?
примерно то же, что и go в core.async - перекомпилирует код в SSA формы - стейт машину
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
и что делает !?
принимает 3 разных типа:
1) результат выполнения функции с эффектами, чтобы их можно было друг из друга вызывать
2) эффект напрямую
3) любое другое значение для обратной совместимости
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
что делает break?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
тут вызывается эффект напрямую
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
источник

GG

Grigory Glushko in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
примерно то же, что и go в core.async - перекомпилирует код в SSA формы - стейт машину
Еще раз: это механизм, внутренности
Мне как пользователю этой либы не так уж важно как оно там работает под капотом, важно смысл этого break. И пока понятно не стало.
С go как раз понятно - внутри можно использовать некоторые “блокирующие” операции, которые на самом деле не блокируют трэд.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Как пользователю:
Если вы в своей фукнции оборачиваете код в break/with-effects, то внутри можете использовать !. ! - говорит, что тут какой-то побочный эффект.
Чтобы вызвать вашу функцию нужен интерпретатор эффектов, где описана реализация декларируемых в функции эффектов.
Эффект представляется любой clojure стркуктрой, у меня в примерах - это вектор.

делая так, вы получаете
1) детерминируемую тестируемость
вы знаете какие и в каком порядке функция запрашивает эффекты из внешнего мира
2) вы можете сделать неблокирующие обработчики эффектов
3) можете легко синхронно тестировать код для clojurescript на jvm
4) можете перебросить выполнение функции на другую машину/платформу, из jvm в браузер и наоборот
5) можете делать "монадки". Вроде глобального состояния или раннего возврата по аналогии с maybe/either
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Как пользователю:
Если вы в своей фукнции оборачиваете код в break/with-effects, то внутри можете использовать !. ! - говорит, что тут какой-то побочный эффект.
Чтобы вызвать вашу функцию нужен интерпретатор эффектов, где описана реализация декларируемых в функции эффектов.
Эффект представляется любой clojure стркуктрой, у меня в примерах - это вектор.

делая так, вы получаете
1) детерминируемую тестируемость
вы знаете какие и в каком порядке функция запрашивает эффекты из внешнего мира
2) вы можете сделать неблокирующие обработчики эффектов
3) можете легко синхронно тестировать код для clojurescript на jvm
4) можете перебросить выполнение функции на другую машину/платформу, из jvm в браузер и наоборот
5) можете делать "монадки". Вроде глобального состояния или раннего возврата по аналогии с maybe/either
Break -> compile
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
Break -> compile
пока break -> with-effects лучше подходит ИМХО
источник